Winsock2 - 如何打开允许带有MSG_WAITALL的recv()的TCP套接字?

时间:2012-08-31 11:26:31

标签: winsock recv

在此代码中:

// error checking is omitted

// init Winsock2
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);

// connect to server
struct addrinfo *res = NULL, *ptr = NULL, hints;
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;

getaddrinfo(server_ip, "9999", &hints, &res);
SOCKET client_socket = socket(res->ai_family, res->ai_socktype, res->ai_protocol);

connect(client_socket, res->ai_addr, (int)res->ai_addrlen);

freeaddrinfo(res);
res = NULL;

// read the data
unsinged int size1;
if (recv(client_socket, (char*)&size1, sizeof(int), MSG_WAITALL) == SOCKET_ERROR)
{
    return WSAGetLastError();
}

(请注意MSG_WAITALL中的recv()标记)一切正常,期待recv()WSAGetLastError()返回WSAEOPNOTSUPP MSDN声明

  

请注意,如果底层传输不支持MSG_WAITALL,或者套接字处于非阻塞模式,则此调用将因WSAEOPNOTSUPP而失败。此外,如果MSG_WAITALL与MSG_OOB,MSG_PEEK或MSG_PARTIAL一起指定,则此调用将失败并返回WSAEOPNOTSUPP。数据报套接字或面向消息的套接字不支持此标志。

但看起来我从这个列表中做的事情看起来并不像。为什么我的recv()电话不起作用?

1 个答案:

答案 0 :(得分:2)

  

看起来我从这个列表中做了些什么。

是的,你是 - 列表中的第一个项目:

  

底层传输不支持MSG_WAITALL

TCP不支持MSG_WAITALL。 TCP是一个字节流,它不处理消息。 recv()不仅限于TCP,它还支持底层提供程序支持的任何传输 - TCP,UDP,IPX,ICMP,RAW等。

如果希望recv()等到收到所有请求的TCP数据,则必须将套接字设置为阻塞模式(默认模式),然后设置flags参数{ {1}}为0。