Sockets 套接字API:为什么“connect”不';不返回描述符吗?

Sockets 套接字API:为什么“connect”不';不返回描述符吗?,sockets,network-programming,Sockets,Network Programming,网络编程noob在这里 我对accept和connect套接字函数的行为感到困惑。在大多数编程语言中,这些函数的包装器返回不同类型的值:accept返回一个新的描述符,我们可以使用该描述符发送/接收数据,但connect不返回任何内容(或返回错误代码) 在我看来,connect也应该返回一个描述符。它们都在两个套接字之间打开一个通道,但只有一个函数返回有用的信息,以便与远程套接字通信 这会影响我构建程序的方式。例如,我可以很容易地为每个传入连接生成一个新的工作线程/线程等,但对于我使用conne

网络编程noob在这里

我对
accept
connect
套接字函数的行为感到困惑。在大多数编程语言中,这些函数的包装器返回不同类型的值:
accept
返回一个新的描述符,我们可以使用该描述符发送/接收数据,但
connect
不返回任何内容(或返回错误代码)

在我看来,
connect
也应该返回一个描述符。它们都在两个套接字之间打开一个通道,但只有一个函数返回有用的信息,以便与远程套接字通信

这会影响我构建程序的方式。例如,我可以很容易地为每个传入连接生成一个新的工作线程/线程等,但对于我使用
connect
创建的每个连接,这并不容易,因为在这种情况下我没有新的描述符。(因此,如果不做一些簿记,我不能使用
recv
send

谁能解释一下为什么会这样

我认为原因在于编程语言中的
socket
wrapper密切遵循BSDAPI,在这种情况下,我的问题是:为什么BSDSockets会以这种方式工作?当前的实现会导致不必要的复杂程序或冗余套接字。我要么需要做更多的簿记(导致更复杂的程序),要么为每个输出连接创建一个新的套接字(导致冗余套接字)

谢谢。

connect()
将现有描述符作为输入。首先创建并配置描述符,然后将其连接到服务器。因此不需要返回新的描述符,因为您必须事先创建描述符

accept()
还将现有描述符作为输入,但该描述符表示侦听套接字。当接受一个客户机时,需要一个唯一的描述符来读取/写入该特定客户机,侦听描述符不能用于此,因此
accept()
返回一个新的描述符

您不需要以不同的方式构造线程。在客户端,将
connect()
连接到服务器后,生成一个线程,并为其指定已连接的描述符。在服务器端,在您
accept()
a客户机之后,生成一个线程,并为其提供已接受的描述符。在这两种情况下,线程只需关心操作哪个描述符,而不必关心描述符来自何处。这两个线程都可以根据需要使用
recv()
send()
,然后在使用完描述符后使用它

不能为新连接重用套接字描述符(Windows上的WinSock2具有非标准扩展,但该功能不常用)。连接断开后,必须关闭其描述符。无论何时需要创建新连接,都必须创建新的描述符