温索克MSG_DONTWAIT等价物

Winsock MSG_DONTWAIT equivalent

本文关键字:DONTWAIT 等价物 MSG      更新时间:2023-10-16

在Windows下移植Unix C++代码并使用sockets/winsock API时,我在服务器端遇到了这个问题:

recv(ClientSocket, recvbuf, recvbuflen, MSG_DONTWAIT); // UNIX code

我从这里发现,WSA 的 MSG_DONTWAIT 标志的等效项是使用 ioctlsocket 将套接字设置为非阻塞模式:使用 arg 调用 FIONBIO != 0(这是文档)。

在服务器端,我有两个套接字:

  • 用于连接到服务器的套接字:

    SOCKET ListenSocket = socket(...)
    bind(ListenSocket, ...)
    listen(ListenSocket, ...)
    ...
    
  • 用于接受来自客户端连接的临时套接字:

    SOCKET ClientSocket;
    ClientSocket = accept(ListenSocket, ...)
    recv(ClientSocket, ...)
    ...
    

我用哪个插座呼叫ioctlsocket?在哪里?(我的意思是这些步骤在哪里?

顾名思义,ListenSocket 意味着侦听传入 (TCP/IP) 连接的套接字,并且仅用于此目的。你稍后在该套接字上调用accept()。accept() 返回另一个套接字,一旦有传入连接。这是客户端套接字这将用于向/从发送/接收数据。它也是插座需要进入非阻塞模式才能模拟MSG_DONTWAIT的行为(特定于Linux,不要现在知道POSIX是否也定义了这一点)。

因此,简而言之,在接受之后和接收之前调用 ioctlsocket客户端套接字。

注意:如果再次调用accept(),您还可以有多个连接,每个连接都有一个由accept()返回的单独套接字。你然后使用类似 select() 的东西来多路复用 I/O。