我试图制作一个程序,使用winsock为我的学校项目发送信息(字符集)到另一个程序(客户端/服务器)。
我发送的消息在另一方收到,但最后有额外的字符。 I.E.如果我想发送" hallo"我收到" hallod3"或一些随机符号。
P.S:邮件从客户端发送到服务器
这是我在服务器上的代码:
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),它接受一个字符串并显示它。
P.S:我确定了字符串' sendbuf'在客户端,没有额外的角色,我甚至添加' \ 0'在字符串的末尾。这可能是什么问题?
答案 0 :(得分:2)
没有收到额外的字符'。只是在显示接收缓冲区时你忽略了iResult。它只适用于iResult字节,而不是整个事件。
答案 1 :(得分:1)
strlen返回的计数不包括' \ 0'性格,所以' \ 0'字符不会被发送。 此外,您无法保证在一次recv通话中收到整条消息。