我正在编写自己的 TFTP 客户端。客户端是用 c++ 编写的(部分是 c),并在 unix 系统(Linux Debian stable)上运行。
这是我的问题:
我可以将我的读取请求 (RRQ) 发送到 TFTP 服务器(在 Windows XP 上打开 TFTP 服务器)。TFTP 服务器收到 RRQ,但不能发送应答。
在服务器端我看到这条消息:Client 192.168.1.110:55239 C:\OpenTFTPServer\test.txt, Communication Error
但是端口 55239 不是我在 TFTP-Client 中定义的端口。
这是我的代码部分:
设置客户端和服务器地址:
memset(&servaddr,0,sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(servport); // servport=69 servaddr.sin_addr.s_addr = inet_addr("192.168.1.152"); memset(&cliaddr,0,sizeof(cliaddr)); cliaddr.sin_family = AF_INET; cliaddr.sin_port = htons(cliport); // cliport=13337 cliaddr.sin_addr.s_addr = inet_addr("192.168.1.110");
连接和绑定:
if (connect(serv, (struct sockaddr *) &servaddr, serv_length) < 0) { bail("Unable to connect with the server!"); } if(bind(cli, (struct sockaddr *)&cliaddr, cli_length)<0) { bail("Unable to bind to adr & port!"); }
创建 TFTP 请求:
memset( &cBuf1, 0, sizeof cBuf1); rdwrFrame = (struct tftp_wr_rq *)&cBuf1; rdwrFrame->opcode=htons(1); rdwrFrame->data={'t','e','s','t','.','t','x','t','\0','o','c','t','e','t','\0'};
发送 TFTP 请求:
if (sendto (serv,cBuf1,19,0,(struct sockaddr *)&servaddr,serv_length) < 0) { bail ("Send the first requirment Frame error -- UDP"); }
这是我的问题:
我在做什么错,TFTP 服务器接收到错误的端口?我认为它应该设置为 cliaddr.sin_port = htons(cliport);
感谢您的帮助和问候 Rico
回答:
我的问题是,我将错误的套接字与错误的地址结构组合在一起
这是我的工作代码部分:
创建套接字:
serv = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (serv < 0) { bail("Unable to create socket tx!"); } cli = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (cli < 0) { bail("Unable to create socket rx!"); }
设置客户端和服务器地址:
memset(&servaddr,0,sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(servport); servaddr.sin_addr.s_addr = inet_addr("192.168.1.152"); memset(&cliaddr,0,sizeof(cliaddr)); cliaddr.sin_family = AF_INET; cliaddr.sin_port = htons(cliport); cliaddr.sin_addr.s_addr = inet_addr("192.168.1.110");
连接和绑定:
if(bind(cli, (struct sockaddr *)&cliaddr, cli_length)<0) { bail("Unable to bind to adr & port!"); } if (connect(serv, (struct sockaddr *) &servaddr, serv_length) < 0) { bail("Unable to connect with the server!"); }
创建 TFTP 请求:
memset( &cBuf1, 0, sizeof cBuf1); rdwrFrame = (struct tftp_wr_rq *)&cBuf1; rdwrFrame->opcode=htons(1); rdwrFrame->data={'t','e','s','t','.','t','x','t',(char)0,'o','c','t','e','t',(char)0};
发送 TFTP 请求:
if (sendto (cli,cBuf1,19,0,(struct sockaddr *)&servaddr,serv_length) < 0) { bail ("Send the first requirment Frame error -- UDP"); }
接收数据:
recvfrom(cli,cBuf2,19,0,(struct sockaddr *)&cliaddr,(socklen_t*)&cli_length);