双向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)

+0

就是“监听器”报告“监听器:文件大小已发送”? – cnicutar

+0

我想知道为什么UDP? TCP是一个更好的传输文件的协议。 UDP不提供诸如顺序传送,重新发送损坏的数据等等,这些在传输文件时是关键。 –

+0

是的,监听者正在报告文件大小已被发送。 另外我想学习UDP,我认为知道两者都很有价值。 – user974703

您没有发送给正确的对等人。您从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) 
+0

宾果!这是问题所在。唯一我现在注意到的是,说话者打印出的最后一封信(文件大小)是垃圾。我假设这是因为我发送的字符串末尾没有\ n? – user974703

+0

@ user974703你可能想在某处设置'\ 0'。 – cnicutar

最简单的解决方案是让你的“发送者”监听它用来发送数据包到服务器的相同端口/ IP。服务器可以从数据包头中提取源IP /端口,并在那里发送它的回复。如果您需要使用不同的端口/ ips进行回复,那么您的“发件人”必须将该信息包含在发送的内容中。例如“这是您的信息,请将回复发送到x.x.x.x:yyy”

+0

它不必听。 'recvfrom'(它已经在做)就足够了。 – cnicutar