双向UDP客户端和服务器?
我正在尝试使用UDP来实现基本的文件传输协议。 我使用Beej's Guide作为参考,我将发布的大部分代码都是从那里发布的。双向UDP客户端和服务器?
我的程序到目前为止都有'讲话者'发送它想要的'接收'文件的名称。
从那里,接收器检查文件是否存在,如果存在,它会计算出文件的大小。
现在,这里是我遇到问题的地方。我需要接收器将文件的大小发送给发言者。你可以在我的代码(下面的链接)中看到我是如何实现它的。然而,谈话者只是挂起,就像仍在等待发送内容。
这让我觉得接收者需要一些额外的代码来允许它与讲话者进行通信,而不仅仅是从它接收数据(我习惯了TCP,所以原谅我缺乏知识)。
有人能告诉我我缺少什么代码,或者如果我使用的功能错误? Beej的指导很难遵守,他没有提供双向交流的例子。
谢谢,让我知道如果你需要任何更多的信息。
监听器:http://pastebin.com/UL1xjDnP
发话:http://pastebin.com/B2zrXPgZ
编辑:解决了! 感谢cnicutar,
我解决了服务器在这段代码的时候我应该已经解决了客户端
if ((numbytes = sendto(sockfd,buffer,strlen(buffer), 0, p->ai_addr, p->ai_addrlen)) == -1)
应改为
if ((numbytes = sendto(sockfd,buffer,strlen(buffer), 0, (struct sockaddr *)&their_addr, &addr_len)) == -1)
您没有发送给正确的对等人。您从getaddrinfo
获得p
,然后发送给它。所以你正在发送消息给你自己。
for(p = servinfo; p != NULL; p = p->ai_next)
/* .... */
numbytes = recvfrom(sockfd, buf, MAXBUFLEN-1 , 0,
(struct sockaddr *)&their_addr, &addr_len)) == -1)
/* .... */
if ((numbytes = sendto(sockfd,buffer,strlen(buffer), 0,
p->ai_addr, p->ai_addrlen)) == -1)
你可能想将其发送到“他们”:
if ((numbytes = sendto(sockfd,buffer,strlen(buffer), 0,
(struct sockaddr *)&their_addr, &addr_len)) == -1)
宾果!这是问题所在。唯一我现在注意到的是,说话者打印出的最后一封信(文件大小)是垃圾。我假设这是因为我发送的字符串末尾没有\ n? – user974703
@ user974703你可能想在某处设置'\ 0'。 – cnicutar
最简单的解决方案是让你的“发送者”监听它用来发送数据包到服务器的相同端口/ IP。服务器可以从数据包头中提取源IP /端口,并在那里发送它的回复。如果您需要使用不同的端口/ ips进行回复,那么您的“发件人”必须将该信息包含在发送的内容中。例如“这是您的信息,请将回复发送到x.x.x.x:yyy”
它不必听。 'recvfrom'(它已经在做)就足够了。 – cnicutar
就是“监听器”报告“监听器:文件大小已发送”? – cnicutar
我想知道为什么UDP? TCP是一个更好的传输文件的协议。 UDP不提供诸如顺序传送,重新发送损坏的数据等等,这些在传输文件时是关键。 –
是的,监听者正在报告文件大小已被发送。 另外我想学习UDP,我认为知道两者都很有价值。 – user974703