我正在尝试使用UDP实现一个基本的文件传输协议。我正在使用Beej‘reference作为参考,我将要发布的大部分代码都是从那里来的。
到目前为止,我的程序已经将它想要的文件的名称发送给“接收者”。
从那里,接收者检查文件是否存在,如果存在,它将计算出文件的大小。
这就是我遇到问题的地方。我需要接收器把文件的大小发送给通话者。在我的代码(下面的链接)中可以看到我是如何实现它的。然而,说话的人只是挂着,好像还在等着什么东西被送出去。
这让我认为,接收者需要一些额外的代码来让它与对话者通信,而不仅仅是接收来自它的数据(我已经习惯了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)
发布于 2011-10-18 17:44:46
你没有派到合适的同伴那里。您正在从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)发布于 2011-10-18 17:35:36
最简单的解决方案是让您的“发送方”监听它用来向服务器发送数据包的端口/ip。服务器可以从数据包报头中提取源ip/端口,并在那里发送其答复。如果您需要为回复使用不同的端口/ips,那么您的“发件人”将不得不将该信息包含在它发送的内容中。“这是你的信息,发送给x.x:yyy”
https://stackoverflow.com/questions/7811331
复制相似问题