0

对于我的回显服务器/客户端,当我的客户端与我的服务器通信时,服务器回显的末尾总会有一些奇怪的额外字符。

客户(发送):

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”这样的其他输入很好。

有任何想法吗?

4

2 回答 2

2

\0问题出在客户端,您在打印条目之前没有剪辑条目printf。尝试这个:

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是接收缓冲区的长度。

于 2013-09-28T09:03:09.610 回答
0

或者,如果您对有多余的缓冲区空间没有信心,那就更好了:

printf("[RECR %s] %.*s\n", ip.c_str(), rnet, recvbuf);
于 2013-09-30T02:09:08.297 回答