UDP服务器无法传输数据。

3
我写了一个简单的UDP服务器,需要向一些客户端传输特定数据。但是尽管服务器成功执行send,却无法传输任何字节。send的返回值为0,尽管我有足够的数据要传输。你可以在此处查看所述服务器的代码:http://pastebin.com/zeMcwd6X 请问您能帮忙找到可能的问题吗?对此方面的任何回复都将不胜感激。
提前致谢! Mawia
编辑:伙计们,正如Yasir先生所指出的那样,拼写错误已经得到了纠正。但是问题仍然存在。
2个回答

3
您使用了sendto的方式不正确。您应该在第三个参数中指定要发送的字节数,但是您并没有这样做:
n=sendto(sockfd,data,n,0,(struct sockaddr *)&setOfClient[k],(char*)(setOfClient+1)-(char*)setOfClient);

第一次迭代时,n由于之前的int n=0;而被赋值为0。因此,返回值是0并且永远不会改变,因为循环中总是使用n

因此,在调用sendto时,使用strlen(data)而不是n作为参数,并使用另一个变量来存储sendto的返回值会更有意义。

附:阅读man手册非常有用,它们通常会提供您想要了解的大部分细节,所以请参阅man 2 sendto


非常感谢您指出那个错误,但问题是即使纠正了那个愚蠢的错误,问题仍然存在。 - mawia
尝试使用sendto(sockfd,data,strlen(data),0,(struct sockaddr *)&setOfClient[k],sizeof(struct sockaddr))。我不知道是什么让你使用那个丑陋的东西(char*)(setOfClient+1)-(char*)setOfClient,你应该指定传递给函数的结构体的大小。示例 - YasirA

2
你的问题在这里:

int n = 0;
for( k = 0; k < numberOfConnections; k++ )
    n = sendto( sockfd, data, n, 0, ... );

注意n=0;的赋值 - 这会要求套接字发送一个空数据报。
以下是您代码的一些注意事项:
- 避免硬编码端口号 - 迟早你将不得不更改它们 - 最小化全局变量,使用函数参数替代,使用结构体和指针 - 考虑使用组播向多个节点发送相同的消息 - 考虑使用连接的UDP套接字进行与同一节点的多信息UDP交换
希望这能帮到您。
编辑:
在互联网上进行组播是具有挑战性的 - 您需要明确的路由器支持或某种类型的隧道。也就是说,组播最适合本地网络。如果您感兴趣,请查看mbone项目
请查看epoll(2)/kqueue(2)高性能网络设施。同时阅读以下页面:http://www.kegel.com/c10k.htmlhttp://pl.atyp.us/content/tech/servers.html

感谢您的回复和亲切建议。 我正在尝试制作实时视频流。我的整个项目都依赖于选择最佳方式,以最小化服务器和互联网骨干的带宽消耗。 但是,考虑到多播,似乎所有解决方案都已经存在了。只需将其发送到多播地址,关注的人就会接收到。所以完全没有烦恼!您怎么看? - mawia
@mawia,我在答案中添加了更多信息。 - Nikolai Fetissov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接