温索克MSG_DONTWAIT等价物
Winsock MSG_DONTWAIT equivalent
在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。
相关文章:
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- python集合的C++等价物是什么.计数器
- C++中是否存在 std::conditional 的懒惰等价物?
- std::endl,在 Python 中是否有等价物?(返回 + 刷新)
- 在本征C++中 MKL 的函数"zgges"等价物是多少?
- 在C++中使用std或boost库的Qtimer等价物是什么
- GLM中的Java Matrix4.transform等价物
- 对于std::bitset,是否有一个ffs()等价物
- std::move() 或其在局部变量上的显式等价物可以允许 elision 吗?
- 这个 matlab 代码的C++等价物是什么(fread matlab vs fread C/C++)?
- 对于wchar_t,字符(0)或'