【问题标题】:Server broadcasts only to first client服务器仅向第一个客户端广播
【发布时间】:2018-11-11 16:05:40
【问题描述】:

我正在尝试从服务器向所有客户端广播消息,但只有一个客户端接收到消息。

我想运行this server 和两个或更多this client 实例(取自Donahoo,Calvert,“C 中的TCP/IP 套接字”,1e;我可以根据要求将代码粘贴到这个问题中)。

程序在单个客户端上运行良好,但在运行两个客户端时,只有一个(第一个)收到消息,而第二个实例则卡住了(bind)。

我不知道我做错了什么,我确定程序是正确的,所以也许我运行错了。我将服务器启动为:

$ ./BroadcastSender localhost 1337 hey &

对于客户端,我尝试了两种变体,第一种:

$ ./BroadcastReceiver 1337 & ./BroadcastReceiver 1337 &

在第二个变体中,我在close(sock) 之后添加了while (1) {},然后运行为:

$ ./BroadcastReceiver 1337 &
$ ./BroadcastReceiver 1337 &

两种变体给出相同的结果,即第一个客户端收到消息,另一个没有,而是在尝试bind时卡住了。

我是否以错误的方式运行服务器/客户端,或者代码中是否缺少某些内容?我是套接字新手,所以我真的不知道服务器代码中是否有任何内容,例如“我将只向一个客户端广播”。

你能给我一些正确的方向吗?还有其他关于广播的问题和答案,但我还没有找到解决这个特定问题的问题和答案。谢谢。

【问题讨论】:

    标签: c sockets broadcast


    【解决方案1】:

    您不能在同一个端口上绑定 2 个进程。不熟悉广播器,但通常您有 2 个选项 - 在同一网络上的 2 台机器上运行 2 个进程,或者在单独的端口上运行客户端并让广播器在多个端口上广播

    在 2 台机器上运行 2 个进程时的命令行应该是这样的:

    $ ./BroadcastSender 127.0.255.255 1337 hey &
    

    当 127.0.255.255 是您的子网掩码时

    --- 编辑(感谢@Jeremy)---

    您还可以使用 setsockopt 将两个套接字绑定到同一个 UDP 端口 带有 SO_REUSEADDR/SO_REUSEPORT 标志

    【讨论】:

    • 实际上,您可以将两个套接字绑定到同一个 UDP 端口,但为了做到这一点,您必须在调用bind()之前的套接字。
    猜你喜欢
    • 1970-01-01
    • 2018-11-14
    • 2012-07-18
    • 1970-01-01
    • 2016-05-24
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多