【问题标题】:udp server unable to transmit dataudp 服务器无法传输数据
【发布时间】:2011-12-25 13:17:22
【问题描述】:

我编写了一个简单的 udp 服务器,它必须将某些数据传输到它的少数客户端。 但是虽然服务器成功执行了发送,但是甚至无法传输一个字节。虽然我有足够的数据可以传输,但是发送的返回值为0。您可以在此处查看所述服务器的代码:http://pastebin.com/zeMcwd6X

你们能帮忙找出可能的罪魁祸首吗?在这方面的任何回复将不胜感激。 非常感谢提前! 马维亚

编辑:伙计们,正如 Yasir 先生正确指出的那样,该错字已被更正。但问题是即使在更正之后问题仍然存在。

【问题讨论】:

    标签: c sockets


    【解决方案1】:

    您错误地使用了sendto。您应该在第三个参数中指定要发送的字节数,但您有:

    n=sendto(sockfd,data,n,0,(struct sockaddr *)&setOfClient[k],(char*)(setOfClient+1)-(char*)setOfClient);
    

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

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

    P。 S. 阅读手册页很有用,它们往往会为您提供您想知道的大部分细节,所以man 2 sendto

    【讨论】:

    • 是的,非常感谢您指出那个错误,但问题是即使纠正了那个愚蠢的错误,问题仍然存在
    • 试试sendto(sockfd,data,strlen(data),0,(struct sockaddr *)&setOfClient[k],sizeof(struct sockaddr));。我不知道是什么让你使用那个丑陋的东西(char*)(setOfClient+1)-(char*)setOfClient,你应该指定你传递给函数的 structure 的大小。 Example
    【解决方案2】:

    你的问题在这里:

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

    注意 n=0; 分配 - 您要求套接字发送一个空数据报。

    关于您的代码的其他一些注释:

    • 避免硬编码诸如端口号之类的东西 - 迟早您将不得不更改它们
    • 尽量减少全局变量,改用函数参数,使用结构和指针
    • 考虑使用multicast 向多个节点发送相同的消息
    • 考虑connected UDP sockets 与同一节点进行多消息UDP 交换

    希望这会有所帮助。

    编辑:

    互联网上的多播具有挑战性 - 您需要明确的路由器支持或某种隧道。也就是说,多播最好在本地网络上。有兴趣的可以关注mbone project

    看看epoll(2)/kqueue(2) 的高性能网络设施。另请阅读以下页面:http://www.kegel.com/c10k.htmlhttp://pl.atyp.us/content/tech/servers.html

    【讨论】:

    • 感谢您的回复和您的善意建议。我正在尝试制作实时视频流媒体。我的整个项目都依赖于选择最佳方式,以最大限度地减少服务器和互联网骨干网的带宽消耗。但是考虑到多播,似乎所有的解决方案都已经存在。只需将其发送到多播地址,concrnd ppl 就会接收它。所以一点也不头疼!你有什么意见??
    • @mawia,我在答案中添加了更多信息。
    猜你喜欢
    • 2017-10-13
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多