【发布时间】:2014-02-06 09:05:22
【问题描述】:
我正在试验 Linux UDP 套接字。我有一台服务器和客户端以下列方式相互通信。
服务器:在端口 X 上向其子网中的所有 IP 发送广播通告。
客户端:通过将单播消息发送回服务器来响应公告。此消息将直接发送回端口 X。
在服务器上,我有一个线程定期发送通知。我现在想添加更多代码来接收来自客户端的响应以及向特定客户端发送单播消息。下面列出了我为服务器提出的方案。
线程 1
- socket_a 上的广播,使用 setsockopt() 设置 SO_BROADCAST。在端口 X 上发送广播通知。
线程 2
- 使用 socket_b 从端口 X 读取数据。由于代码当前结构的限制,该线程无法访问 socket_a。请注意,该端口与 socket_a 共享。调用 bind() 以读取此套接字上的数据。
线程 3
- 使用端口 X 上的 socket_b 将单播数据发送到特定客户端。请注意,套接字和端口都与线程 2 共享,并且端口在所有三个线程和两个套接字中是通用的。
不分先后,以下是我的问题(请耐心等待,我对 unix 套接字编程还很陌生):
我需要在两个套接字之间进行任何锁定还是在操作系统中处理?也就是说,我可以同时向两个套接字发送数据并且不会因为两者使用相同的端口而发生一些奇怪的冲突吗?
我是否需要担心线程 2 接收由任一“发送者”线程发出的数据?如何防止这种情况发生?
是否需要启用任何选项才能使其正常工作?广播套接字 (socket_a) 是否在单播 (socket_b) 之前设置好?
我应该在端口 X 上创建一个专用的“接收”套接字吗?也就是说,拥有一个仅用于接收数据的套接字是否有意义?这是唯一会调用 bind() 的套接字。
鉴于所有三个线程都使用同一个端口,我还应该担心其他问题吗?不幸的是,这是我正在处理的一个约束。如果上述方案不可行,我可能不得不重新审视我的单端口设计。
提前感谢您的帮助。
【问题讨论】:
标签: c linux multithreading sockets udp