1

学校のプロジェクトで winsock を使用して、情報 (文字セット) を別のプログラム (クライアント/サーバー) に送信するプログラムを作成しようとしています。

私が送信したメッセージは反対側で受信されますが、末尾に余分な文字が含まれています. IE 「ハロー」を送信したい場合、「hallod3」またはいくつかのランダムなシンボルを受け取ります。

PS: メッセージはクライアントからサーバーに送信されます

サーバー上の私のコードは次のとおりです。

 char recvbuf[DEFAULT_BUFLEN];
    int recvbuflen = DEFAULT_BUFLEN;

  do {

        iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);     
        if (iResult > 0) {
            ShowMessage(recvbuf);
        }

        else if (iResult == 0)
            ShowMessage("Connection closing...\n");
        else  {
            ShowMessage("recv failed with error: %d\n", WSAGetLastError());
            closesocket(ClientSocket);
            WSACleanup();
            ShowMessage("send failed");
        }
     } while (iResult > 0);

クライアントは次のとおりです。

 char sendbuf[DEFAULT_BUFLEN];

  iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 );
    if (iResult == SOCKET_ERROR) {
        ShowMessage("send failed with error: %d\n", WSAGetLastError());
        closesocket(ConnectSocket);
        WSACleanup();
       ShowMessage("send failed");
    }

DEFAULT_BUFLEN が定義されています (メッセージの長さ)。ShowMessage() は、文字列を取得して表示する VCL コンポーネント (私は Borland C++ Builder を使用しています) の関数です。

PS: クライアントで文字列 'sendbuf' を確認しましたが、余分な文字はありません。文字列の末尾に '\0' を追加することさえあります。

ここで何が問題なのですか?

4

2 に答える 2

2

「文字数増し」ではありません。受信バッファを表示するときに iResult を無視しているだけです。全体ではなく、iResult バイトに対してのみ有効です。

于 2014-03-13T02:01:34.563 に答える
1

strlen によって返されるカウントには「\0」文字が含まれないため、「\0」文字は送信されません。また、1 回の recv 呼び出しでメッセージ全体を受信できる保証はありません。

于 2014-03-13T02:01:50.797 に答える