C Linux UDP套接字/端口重用 我正在使用Linux UDP套接字进行实验。我有一个服务器和一个客户端,它们通过以下方式相互通信

C Linux UDP套接字/端口重用 我正在使用Linux UDP套接字进行实验。我有一个服务器和一个客户端,它们通过以下方式相互通信,c,linux,multithreading,sockets,udp,C,Linux,Multithreading,Sockets,Udp,服务器:在端口X上向其子网上的所有IP发送广播公告 客户端:通过向服务器发送单播消息来响应通知。此消息将直接发送回端口X 在服务器上,我有一个线程定期发送公告。现在,我想添加更多代码来接收来自客户端的响应,以及向特定客户端发送单播消息。我在下面列出了我对服务器的建议方案 线程1 在socket_a上广播,使用setsockopt()设置socket_广播。在端口X上发送广播通知 线程2 使用socket_b从端口X读入数据。由于代码当前结构的限制,此线程无法访问套接字。请注意,该端口与套接

服务器:在端口X上向其子网上的所有IP发送广播公告

客户端:通过向服务器发送单播消息来响应通知。此消息将直接发送回端口X

在服务器上,我有一个线程定期发送公告。现在,我想添加更多代码来接收来自客户端的响应,以及向特定客户端发送单播消息。我在下面列出了我对服务器的建议方案

线程1
  • 在socket_a上广播,使用setsockopt()设置socket_广播。在端口X上发送广播通知
线程2
  • 使用socket_b从端口X读入数据。由于代码当前结构的限制,此线程无法访问套接字。请注意,该端口与套接字共享。调用bind()读取此套接字上的数据
线程3
  • 使用端口X上的套接字_b向特定客户端发送单播数据。请注意,套接字和端口都与线程2共享,并且端口在所有三个线程和两个套接字中都是公用的
以下是我的问题(恕我直言,我对unix套接字编程相当陌生):

  • 我是否需要在两个套接字之间执行任何锁定,或者这是在操作系统中处理的?也就是说,我是否可以同时向两个套接字发送数据,而不会因为它们使用相同的端口而发生一些奇怪的冲突

  • 我是否需要担心线程2接收由“发送方”线程发送的数据?我如何防止这种情况

  • 我需要启用哪些选项才能使其正常工作?广播套接字(套接字_a)是否在单播套接字(套接字_b)之前设置好有关系

  • 我应该在端口X上创建一个专用的“接收”套接字吗?也就是说,有一个只用于接收数据的套接字有意义吗?这是唯一一个调用bind()的套接字

  • 考虑到所有三个线程都使用同一端口,我还应该担心其他问题吗?不幸的是,这是我正在处理的一个约束。如果上述方案不可行,我可能不得不重新考虑我的单端口设计

  • 提前感谢您的帮助

    我是否需要在两个插座之间进行任何锁定,或者是否已处理 在操作系统中?也就是说,我可以同时向套接字和 没有发生奇怪的冲突,因为两者使用相同的端口

    对于UDP,不需要锁定。也就是说,您可能仍然会发现为每个线程创建一个单独的套接字更容易,因为安全地协调多线程使用的套接字的关闭和销毁可能有点棘手

    我是否需要担心线程2接收由发送的数据 “发件人”线程中的任何一个?我如何防止这种情况

    是的,线程2至少可能看到广播数据包,也可能看到单播数据包(如果它们被发送到线程2运行的计算机上)。避免这种情况的最简单方法是在不同的端口上侦听(例如,将广播数据包发送到端口X,但让客户端将其单播回复数据包发送回端口X+1;这样,您在端口X+1上收到的任何数据包几乎肯定是来自客户端的单播回复)

    我需要启用哪些选项才能使其正常工作

    就这么一个,阿福。(如果您想让同一台机器上的多个套接字侦听同一端口,您还需要这样做\u REUSEADDR和[在MacOS/X下]SO\u REUSEPORT,但希望您不需要这样做)

    广播套接字(socket_a)是否在 单播一(socket_b)

    不,订购不重要

    我应该在端口X上创建一个专用的“接收”套接字吗?也就是说,你愿意吗 有一个只用于接收数据的套接字是有意义的吗? 这是唯一一个调用bind()的套接字

    您可以这样做,但是使用相同的套接字发送和接收也可以。(请注意,如果使用阻塞I/O,则必须注意recv()等长时间不返回的情况,这可能会阻止线程同时执行发送等其他操作——这就是为什么我几乎总是使用非阻塞I/O和select()的原因。)在我的程序中。这样,我就可以使用一个线程来做我想做的任何事情,这允许我避免所有非确定性和潜在的竞争条件以及多线程带来的死锁)

    考虑到这一切,我还应该担心其他问题吗 三个线程使用同一端口?不幸的是,这是一个错误 我正在处理的约束。如果上述方案不可行, 我可能不得不重新考虑我的单端口设计

    使用一个端口就可以了,只要准备好接收你自己的广播数据包就可以了(也就是说,发生这种情况时不要进入反馈循环)

    我是否需要在两个插座之间进行任何锁定,或者是否已处理 在操作系统中?也就是说,我可以同时向套接字和 没有发生奇怪的冲突,因为两者使用相同的端口

    对于UDP,不需要锁定。也就是说,您可能仍然会发现为每个线程创建一个单独的套接字更容易,因为安全地协调多线程使用的套接字的关闭和销毁可能有点棘手

    我是否需要担心线程2接收由发送的数据 “发件人”线程中的任何一个?我如何防止这种情况

    是的,线程2至少可能看到广播数据包,也可能看到单播数据包(如果它们被发送到线程2所在的计算机)