1

このコードでは:

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

4

1 に答える 1

1

このリストから何かをしているようには見えません。

はい、あなたは-リストの最初の項目です:

基になるトランスポートはMSG_WAITALLをサポートしていません

MicrosoftのデフォルトのTCPトランスポートプロバイダーはをサポートしていませんMSG_WAITALLrecv()、および一般的にWinsockは、MicrosoftのTCPプロバイダーだけに限定されません。サードパーティプロバイダー、およびプロバイダーがサポートするすべてのトランスポートプロトコル(TCP、UDP、IPX、ICMP、RAWなど)をサポートします。

MicrosoftのTCPを使用しているときrecv()に、要求されたすべてのTCPデータが受信されるまで待機する場合は、ソケットをブロッキングモード(デフォルトモード)に設定してから、flagsパラメーターrecv()を0に設定する必要があります。ただし、それでも保証されません。は、要求されたバイト数よりも少ないバイト数で戻る可能性があるため、意図したすべてのバイトが実際に受信されるまで、ループでrecv()呼び出す準備をしておく必要があります。recv()

于 2012-08-31T18:35:56.573 に答える