Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 仅在服务器中的一个套接字上处理多个TCP连接_Sockets_Networking_Tcp_Network Programming_Tcpserver - Fatal编程技术网

Sockets 仅在服务器中的一个套接字上处理多个TCP连接

Sockets 仅在服务器中的一个套接字上处理多个TCP连接,sockets,networking,tcp,network-programming,tcpserver,Sockets,Networking,Tcp,Network Programming,Tcpserver,请假设我们可以区分不同TCP连接的数据包,如果可以,那么我们可以在服务器端的一个套接字上接受多个TCP连接吗?我知道服务器绑定到一个套接字上,并且在接受新连接时为新连接分配一个新套接字。我会覆盖接受系统调用吗 请假设我们可以区分不同TCP连接的数据包 你不能假设。在TCP连接上,应用程序看不到任何“数据包”。TCP连接提供字节流。你不能保证你读到的下一个东西会是一个消息头,告诉你消息来自哪个客户端。那么你希望服务器中的一个套接字接收来自所有连接的所有数据吗?像UDP那样吗?不,这在TCP中是不可

请假设我们可以区分不同TCP连接的数据包,如果可以,那么我们可以在服务器端的一个套接字上接受多个TCP连接吗?我知道服务器绑定到一个套接字上,并且在接受新连接时为新连接分配一个新套接字。我会覆盖接受系统调用吗

请假设我们可以区分不同TCP连接的数据包


你不能假设。在TCP连接上,应用程序看不到任何“数据包”。TCP连接提供字节流。你不能保证你读到的下一个东西会是一个消息头,告诉你消息来自哪个客户端。

那么你希望服务器中的一个套接字接收来自所有连接的所有数据吗?像UDP那样吗?不,这在TCP中是不可能的,因为它是一个连接的协议,每个连接都是一个单独的实体。为什么?您提到的所有内容都已经由TCP完成,并且是以每个已接受连接的单独套接字的形式完成的。你为什么认为你需要重新发明API?@EJP。认为我希望以最小的延迟处理大量连接,因此最好通过一个套接字处理所有连接,而不是为每个连接创建一个套接字,但是ACCEPT systemcall会为每个接受的连接返回单独的套接字。因此,我认为我应该覆盖ACCEPT系统调用@MSH-你将破坏TCP。@MSH-你得到过明确的答案吗?我同意,对于管理10000个低速率连接的服务器来说,没有10000个套接字是很好的。或者,现代系统处理许多套接字的效率可能与应用程序解复用其自身数据的效率相同?数据包边界不可见,但addr、端口信息是可见的。TCP套接字没有理由不能像UDP套接字一样工作,传递“来自addr,port的下一个n字节”,其中n是任意的(与UDP不同)。@user1055568'
addr.port
information'对TCP连接上的应用程序不可见,而不是通过
getpeername()
,这适用于插座,因此适用于整个连接。我不知道你在说什么,我只是说Berkley socket API就是这样设计的,与TCP协议是否定义了应用程序级数据包边界无关。