对于我的回显服务器/客户端,当我的客户端与我的服务器对话时,服务器回显的末尾总是有一些奇怪的额外字符。
客户端(发送):
string input;
while(srnet>0&&start){
cout<<"[Enter to Send]..."<<endl;
getline(cin,input);
if(!strcmp(input.c_str(),"quit")) break; else
srnet=send(conn, input.c_str(),input.length(), 0 );
}
客户端(接收)
while(rnet>0&&start){
char* recvbuf=new char[DEFAULT_BUFLEN];
rnet = recv(conn, recvbuf, recvbuflen, 0);
if (rnet > 0) printf("[RECR %s] %s\n", ip.c_str(),recvbuf);
delete recvbuf;
}
服务器:
rnet = recv(conn, recvbuf, recvbuflen, 0);
if (rnet > 0) {
srnet=send(conn, recvbuf, rnet, 0 );
if ( srnet== SOCKET_ERROR) {
printf("[COMM] send failed with error: %d\n", WSAGetLastError());
closesocket(conn);
break;
}
输出:
dadada
[Enter to Send]...
[RECR localhost:4666] dadadap
fdsfdfd
[Enter to Send]...
[RECR localhost:4666] fdsfdfd
asdsa
[Enter to Send]...
[RECR localhost:4666] asdsap
asdsa
[Enter to Send]...
[RECR localhost:4666] asdsap
aaa
[Enter to Send]...
[RECR localhost:4666] aaa
asdsa
[Enter to Send]...
[RECR localhost:4666] asdsap
请注意,额外的 p 每次都附加到输入“asdsa”。而像“aaa”这样的其他输入很好。
有什么想法吗?
最佳答案
问题出在客户端,在使用 printf
打印条目之前,您没有使用 \0
剪辑条目。试试这个:
char recvbuf [DEFAULT_BUFLEN];
while(rnet>0 && start) {
rnet = recv(conn, recvbuf, recvbuflen, 0);
if (rnet > 0 && rnet < DEFAULT_BUFLEN-1)
{
recvbuf[rnet] = '\0';
printf("[RECR %s] %s\n", ip.c_str(), recvbuf);
}
}
我假设 recv
的返回值是接收缓冲区的长度。
关于C++ 服务器/客户端回显某些输入末尾附加的奇怪字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19064925/