このコードでは:
// 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()
呼び出しが機能しないのですか?