在man pages和程序员单证套接字选项SO_REUSEADDR,并SO_REUSEPORT针对不同的操作系统,不同的,往往非常混乱.有些操作系统甚至没有选项SO_REUSEPORT.WEB中充满了关于此主题的矛盾信息,并且通常您可以找到仅对特定操作系统的一个套接字实现的信息,这些信息甚至可能在文本中没有明确提及.
那究竟有什么SO_REUSEADDR不同SO_REUSEPORT呢?
系统是否没有SO_REUSEPORT更多限制?
如果我在不同的操作系统上使用任何一个,那么预期的行为究竟是什么?
在套接字编程中,您创建一个侦听套接字,然后对于每个连接的客户端,您将获得一个可用于处理客户端请求的普通流套接字.OS管理幕后传入连接的队列.
两个进程无法同时绑定到同一个端口 - 默认情况下,无论如何.
我想知道是否有一种方法(在任何着名的操作系统,特别是Windows上)启动进程的多个实例,这样它们都绑定到套接字,因此它们有效地共享队列.然后每个流程实例可以是单线程的; 它会在接受新连接时阻止.当客户端连接时,其中一个空闲流程实例将接受该客户端.
这将允许每个进程具有非常简单的单线程实现,除非通过显式共享内存,否则不会共享任何内容,并且用户将能够通过启动更多实例来调整处理带宽.
这样的功能是否存在?
编辑:对于那些问"为什么不使用线程?"的人 显然线程是一种选择.但是在单个进程中有多个线程,所有对象都是可共享的,并且必须非常小心以确保对象不是共享的,或者一次只对一个线程可见,或者是绝对不可变的,以及最流行的语言和运行时缺乏对管理这种复杂性的内置支持.
通过启动一些相同的工作进程,您将获得一个默认不共享的并发系统,从而使构建正确且可伸缩的实现变得更加容易.