【发布时间】:2022-01-06 19:34:14
【问题描述】:
我正在通过 UDP(uni assignment)实现一个可靠的、面向连接的应用程序。要求服务器在收到客户端的初始数据包并确认后,创建一个新的工作进程。工作进程应该有一个专用于这个特定客户端的套接字。
现在我看到了三种实现方式。
- 服务器有一个socket,我们称之为
listener_socket,绑定到指定端口,等待请求。然后,我可以在子进程中,connect()这个套接字到客户端地址。 - 或者,我可以完全关闭子进程中的
listener_socket,然后打开一个全新的套接字connection_socket,将其绑定到端口并连接到客户端。 - 或者,在新端口上打开一个新套接字,并编写客户端代码以在连接的剩余时间内处理这个新端口。
我不确定的(关于选项 1)是将listener_socket 连接到客户端如何影响父服务器中的原始listener_socket。它会阻止父级从其他客户端接收更多消息吗?如果不是,为什么?它们最终不是都指向同一个套接字吗?
至于选项 2,这让我非常期待“地址已在使用中”。是否有类似路由器的功能(即最长匹配前缀)将数据报传递到“最合适的”套接字? (好吧,TCP 已经在 accept() 中做到了这一点,所以这个逻辑不太可能被复制到 UDP 中。)
关于选项 3,我认为它的效率很低,因为它意味着我应该为每个客户端使用一个新端口。
那么有人可以建议使用哪种方法,或者是否还有其他我不知道的方法? 谢谢。
【问题讨论】:
-
您谈论的是父母和子女——至少对我而言——建议单独的“分叉”进程(
fork、exec等),但您也谈论线程。你能澄清一下在这种情况下你所说的“父母”和“孩子”是什么意思吗?抱歉,如果我遗漏了什么。 -
@G.M.啊,抱歉,我只是将线程用作进程的同义词,因为我忘记了 POSIX 线程。我的意思是每个进程都有自己的资源副本。我的错!
标签: c linux sockets udp connection