1

ポート 55005 のサーバーに複数の要求 (コマンド) を送信する必要があります。最初の要求取得プロセスは成功し、出力も受け取りました。しかし、2 番目の要求ではエラーが発生します (WSAESHUTDOWN - エラー 10058)。最初のリクエストの後、shutdown(ConnectSocket, SD_SEND); を呼び出します。次に、サーバーのみが最初のリクエストを処理し、出力を送信します。次のリクエストを処理するソケットを再度開くことができますか?**

shutdown(ConnectSocket, SD_SEND) 後に複数のリクエストを処理するにはどうすればよいですか? ご提案いただきありがとうございます。

最初のリクエストを送信し、最初の返信を待ちます。最初のリクエスト応答後、次のリクエストを送信できます。これはビジネス ロジックの要件です。リクエストごとに新しい接続を開きたくありません。

スナップショットコードはここから始まります---------------->

**//This for loop will send multiple request to Servers.**
for(it = CommandList.begin(); it != CommandList.end() ; it++ )
{
    //get each command request & send it to server.
    std::string  sendBuf; // =  (*it);
     sendBuf= *it;
    int length = (int)strlen(sendBuf.c_str());
    //----------------------
    // Send an initial buffer
    iResult = send( ConnectSocket, (char*)sendBuf.c_str(), length, 0 );
    if (iResult == SOCKET_ERROR) {
        wprintf(L"send failed with error: %d\n", WSAGetLastError());
        closesocket(ConnectSocket);
        WSACleanup();
        return 1;
    }

    printf("Bytes Sent: %d\n", iResult);


    // shutdown the connection since no more data will be sent
    iResult = shutdown(ConnectSocket, SD_SEND);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"shutdown failed with error: %d\n", WSAGetLastError());
        closesocket(ConnectSocket);
        WSACleanup();
        return 1;
    }

    // Receive until the peer closes the connection
    do {

        iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
        if ( iResult > 0 )
            wprintf(L"Bytes received: %d\n", iResult);
        else if ( iResult == 0 )
            wprintf(L"Connection closed\n");
        else
            wprintf(L"recv failed with error: %d\n", WSAGetLastError());

    } while( iResult > 0 );
}
4

1 に答える 1

0

Joachimが言ったようshutdownに、接続が完了するまで電話をかけないでください。このTCPソケットは「ストリーム」です...ものは自由に行き来できます。プログラマーとしてのあなたは、「要求」と「応答」がどこから始まりどこで終わるかを決定する必要があります...そのために使用shutdownしないでください。

于 2013-02-06T13:15:54.583 に答える