我正在尝试使用UDP实现基本文件传输协议。 我使用Beej的指南作为参考,我将发布的大部分代码都来自那里。
到目前为止,我的程序让'talker'将所需文件的名称发送给'receiver'。
从那里,接收器检查文件是否存在,如果存在,它会计算出文件的大小。
现在我遇到了问题。我需要接收器将文件的大小发送给讲话者。您可以在我的代码(下面的链接)中看到我是如何实现它的。然而,说话者只是挂起,就像它还在等待发送的东西一样。
这让我觉得接收者需要一些额外的代码才能让它与讲话者沟通,而不仅仅是从中接收数据(我已经习惯了TCP,所以请原谅我缺乏知识)。
有人能告诉我我错过了哪些代码,或者我使用的函数是否错误?很难遵循Beej的指南,他也没有提供双向沟通的例子。
谢谢,如果您需要更多信息,请与我们联系。
听众:http://pastebin.com/UL1xjDnP
发帖者:http://pastebin.com/B2zrXPgZ
我正在使用此代码对服务器进行寻址,当时我应该已经解决了客户端问题
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 :(得分: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”