1

我正在尝试为我的学校项目制作一个使用winsock将信息(字符集)发送到另一个程序(客户端/服务器)的程序。

我发送的消息在另一端收到,但最后有额外的字符。IE 如果我想发送“hallo”,我会收到“hallod3”或一些随机符号。

PS:消息是从Client发送到Server的

这是我在服务器上的代码:

 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' 字符。此外,您不能保证在一次 recv 呼叫中收到整个消息。

于 2014-03-13T02:01:50.797 回答