【问题标题】:Bind function in broadcast message广播消息中的绑定函数
【发布时间】:2014-01-25 13:27:46
【问题描述】:

我正在尝试从服务器向许多客户端发送“广播”消息。

谁必须调用绑定函数服务器或客户端?

【问题讨论】:

  • 首先阅读FAQ 并展示您的尝试。

标签: linux sockets udp broadcast


【解决方案1】:

简短的回答是:客户必须发出bind(2)

Python 中的示例代码:

控制台 1

>>> from socket import *
>>> s = socket(AF_INET, SOCK_DGRAM)
>>> s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
>>> s.bind(("0.0.0.0", 33440))
>>> s.recv(10000)

控制台 2

>>> from socket import *
>>> s = socket(AF_INET, SOCK_DGRAM)
>>> s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
>>> s.bind(("0.0.0.0", 33440))
>>> s.recv(10000)

控制台 3

>>> from socket import *
>>> s = socket(AF_INET, SOCK_DGRAM)
>>> s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
>>> s.sendto("Hello world", ("127.255.255.255", 33440))
11

然后你会在控制台 1 和 2 上看到'Hello world'

更新

在 Console1 和 2 上都发出 s.recv(10000) 后,您将得到如下信息:

$ LANG=C netstat -nu4ap | grep python
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
udp        0      0 0.0.0.0:33440           0.0.0.0:*                           31939/python
udp        0      0 0.0.0.0:33440           0.0.0.0:*                           31447/python
$ uname -a
Linux kaidev01 3.2.0-57-generic #87-Ubuntu SMP Tue Nov 12 21:35:10 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

【讨论】:

  • 感谢您的示例,nodakai.Ive using similar sequence of functions in C++. But In "manuals"(http://www.beej.us/guide/bgnet/output/html/multipage/recvman.html) ive 阅读了从 UDP 使用 recvfrom(而不是 recv) 函数,现在我使用 recvfrom 进行接收,并且它也成功运行。
  • 这对我不起作用,我得到error: [Errno 48] Address already in use。两个“服务器”真的可以监听相同的地址和端口吗?
  • @Martol1ni 请查看我的更新。你真的在两个客户端(接收器)套接字上都发出了setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) 吗?
  • 我确实做到了。我在bind() 命令上收到错误,表明地址正在使用中。
  • 也许您最好向 SO 发布一个包含更多详细信息的独特问题。
猜你喜欢
  • 1970-01-01
  • 2013-09-09
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-17
  • 2019-09-07
  • 1970-01-01
相关资源
最近更新 更多