双向UDP客户端和服务器?

时间:2011-10-18 17:32:48

标签: c sockets networking udp posix

我正在尝试使用UDP实现基本文件传输协议。 我使用Beej的指南作为参考,我将发布的大部分代码都来自那里。

到目前为止,我的程序让'talker'将所需文件的名称发送给'receiver'。

从那里,接收器检查文件是否存在,如果存在,它会计算出文件的大小。

现在我遇到了问题。我需要接收器将文件的大小发送给讲话者。您可以在我的代码(下面的链接)中看到我是如何实现它的。然而,说话者只是挂起,就像它还在等待发送的东西一样。

这让我觉得接收者需要一些额外的代码才能让它与讲话者沟通,而不仅仅是从中接收数据(我已经习惯了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)

2 个答案:

答案 0 :(得分:1)

你没有发送给正确的同伴。您从p获取getaddrinfo,然后发送给它。所以你要把信息发给自己。

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)

答案 1 :(得分:0)

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