在此代码中:
// 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()
电话不起作用?
答案 0 :(得分:2)
看起来我从这个列表中做了些什么。
是的,你是 - 列表中的第一个项目:
底层传输不支持MSG_WAITALL
TCP不支持MSG_WAITALL
。 TCP是一个字节流,它不处理消息。 recv()
不仅限于TCP,它还支持底层提供程序支持的任何传输 - TCP,UDP,IPX,ICMP,RAW等。
如果希望recv()
等到收到所有请求的TCP数据,则必须将套接字设置为阻塞模式(默认模式),然后设置flags
参数{ {1}}为0。