sockets - 套接字API : why `connect` doesn't return a descriptor?

标签 sockets network-programming

网络编程菜鸟在这里,

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

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

这会影响我构建程序的方式。例如,我可以轻松产生一个新的worker/thread/etc。对于每个传入的连接,但对于使用connect创建的每个连接来说,这都不容易实现,因为在这种情况下,我没有新的描述符。(因此,如果不进行簿记,就无法使用recvsend)

谁能解释我为什么这样做呢?

我认为原因是因为编程语言中的socket包装程序紧密遵循BSD API,在这种情况下,我的问题是:为什么BSD套接字以这种方式工作?当前的实现导致不必要的复杂程序或冗余套接字。我要么需要做更多的预定工作(导致更复杂的程序),要么为每个向外的连接创建一个新的套接字(导致冗余的套接字)。

谢谢。

最佳答案

connect()将现有描述符作为输入。首先创建并配置描述符,然后将其connect()到服务器。因此,由于您必须事先创建描述符,因此不需要返回新的描述符。
accept()还采用现有的描述符作为输入,但是该描述符表示监听套接字。当接受一个客户端时,与该特定客户端进行读/写操作需要一个唯一的描述符,不能使用监听描述符,因此accept()返回一个新的描述符。

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

您不能为新的连接重新使用套接字描述符(Windows上的WinSock2具有非标准扩展名允许这样做,但该功能并不常用)。连接断开后,必须关闭其描述符。每当需要创建新连接时,都必须创建新的描述符。

关于sockets - 套接字API : why `connect` doesn't return a descriptor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26958275/

相关文章:

c++ - 停止并等待文件传输协议(protocol),什么时候停止监听?

c# - 在 C# 中发送 SYN 数据包?

c - 如何用socket地址获取自己的IP地址?

c++ - TCP 套接字 : Where does incoming data go after ack(leaves tcp read buffer) but before read()/recv()?

java - 是否可以使用java套接字从客户端发送sslv2hello消息

networking - SOCKS5 绑定(bind)是持久的还是一次性的?

c++ - 通过套接字 C++ 从设备接收消息

python - Unix 域套接字 C 服务器和 Python 客户端

c - WSAConnectByName 超时

iphone - 多个异步 Web 服务请求 NSURLConnection iOS