我想知道,就接受N个不同连接所需的监听端口/服务器套接字数量而言,所需的最小开销是多少,每个连接都使用在IP之上运行的不同传输协议,例如TCP、SCTP、DCCP、UDP等。
当然,一种直接的方法是拥有N个独立的服务器套接字(每个套接字都是通过使用适当的protocol参数调用socket()创建的),每个套接字监听一个唯一的端口。但是,在同时使用多个协议的应用程序中实现此方法将非常不方便,因为客户端需要知道多个服务器端口。此外,在对每个协议只对等一次的对等应用程序中(使用相同的客户端),N个服务器套接字中的每个都只接受单个(客户端)连接的事实看起来像是一个巨大的开销(引入N个额外的套接字纯粹是为了处理到单个对等客户端的N个“真实”连接)。
是否有可能做得更好,例如,通过减少侦听服务器套接字的数量和/或侦听相同的端口?
(为了简单起见,您可以假设N=2,一个连接是TCP,另一个是DCCP或UDP (请不要假设无连接通信,因为DCCP是面向连接的)。)
编辑:我对N个(客户端)连接不感兴趣,这些连接的文件描述符是由N个对accept的调用返回的。问题是使这N个连接成为可能的额外开销(即,必须至少有一个额外的服务器套接字来侦听传入的连接)。
发布于 2014-11-05 21:44:04
总结上面的评论:因为在
int socket(int domain, int type, int protocol)调用我们必须指定protocol,我们不能将一个套接字用于多个协议。我们也不能随身携带
socket(AF_INET, SOCK_RAW, 0);参见SOCK_RAW Demystified。
关于将同一端口与不同的插座一起使用:这种可能性因系统而异;例如,请参阅HP-UX (man 7f inet):
The local port address is selected from independent domains for TCP
and UDP sockets. This means that creating a TCP socket and binding it
to local port number 10000, for example, does not interfere with
creating a UDP socket and also binding it to local port number 10000
at the same time.vs. Linux (man ip):
Only one IP socket may be bound to any given local (address, port) pair.https://stackoverflow.com/questions/20336114
复制相似问题