【问题标题】:Two way UDP client and server?两种方式的UDP客户端和服务器?
【发布时间】:2011-10-18 17:32:47
【问题描述】:

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

到目前为止,我的程序让“谈话者”将它想要的文件名发送给“接收者”。

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

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

这让我觉得接收者需要一些额外的代码来允许它与说话者通信,而不仅仅是从中接收数据(我习惯于 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)

【问题讨论】:

  • “监听器”是否报告“监听器:文件大小已发送”?
  • 我想知道为什么是 UDP? TCP 是一种更好的文件传输协议。 UDP 不提供顺序传送、重新发送损坏的数据等在传输文件时很关键的好处。
  • 是的,监听器报告文件大小已发送。我也想学习UDP,我认为两者都知道很有价值。
  • @user974703 我在下面回答。另外,编辑您的问题并添加相关代码。

标签: c sockets networking udp posix


【解决方案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 你可能想在某处设置\0
【解决方案2】:

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

【讨论】:

  • 它不必听。 recvfrom(它已经在做)就足够了。
猜你喜欢
  • 1970-01-01
  • 2013-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
  • 2020-06-22
  • 2012-01-04
相关资源
最近更新 更多