C++ 服务器/客户端回显某些输入末尾附加的奇怪字符

标签 c++ tcp echo

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

客户端(发送):

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/

相关文章:

php - 选择并打印表中除 1 之外的所有内容

c++ - 单步编译时是否生成目标文件?

c++ - OpenCV 架构 x86_64 的 undefined symbol : error

c++ - 优化网络负载大时接收数据包的流程

c - 从文件中删除第一个单词

java - 如何从在 log4j RollingFileAppender 中的 Java 中启动的 Shell 脚本输出日志?

c++ - 如何发送应用程序的链接,如 Spotify 那样

c++ - 当我将 T& 和 T 作为具有相同名称的函数的返回类型时,如何使用 T& 调用函数

c# - C# 中的远程主机强制关闭现有连接

Bash:为什么 echo 会增加额外的空间?