accept() 创建一个新的套接字是什么意思?

Far*_*hid 2 sockets linux network-programming client-server

我的问题是基于以下理解

  • 套接字由 ip:port 定义。服务器和客户端都有自己的套接字
  • Socket 连接由五个元组 server_ip、server_port、client_ip、client_port、protocol 定义
  • 套接字描述符是标识套接字的整数值

我试图实现我自己的服务器,其中 socket() 和 accept() 返回不同的套接字描述符值(是否总是这样?)。我的问题是为什么说如果服务器中没有打开新端口,accept() 会创建一个新套接字,并且 ip:port 对于 socket() 和 accept() 返回的套接字描述符是相同的。如果新套接字是由 accept() 创建的,它与 socket() 创建的套接字有何不同?

Jea*_*nès 7

  1. 我试图实现我自己的服务器,socket()accept()返回不同的套接字描述符值(是否总是这样?)。

是的。

  1. 我的问题是为什么说accept()如果服务器中没有打开新端口并且 ip:port 对于由socket()和返回的套接字描述符相同,则它会创建一个新套接字accept()。如果新套接字是由accept()它创建的,它与由它创建的套接字socket()有何不同 ?

因为第一个套接字用于等待通信,而第二个套接字用于通信。到呼叫socket(+ bind+ listen)制备的通信端点,又名插座(或服务器套接字)来接收传入呼叫。的呼叫到accept一个充分的准备通信点,对于呼入呼叫,并等待发生这种情况时,创建由所表示的通信信道(2端点+协议)连接的插座由呼叫返回。

C API 可能会让您感到困惑,因为两者都称为套接字,但实际上用途不同。在其他一些语言/API 中进行了区分。例如,在 Java 中ServerSocket,它用于等待来电,Socket用于通信。