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

C++ C++;对于某些输入,服务器/客户端回显附加到末尾的奇怪字符,c++,tcp,echo,C++,Tcp,Echo,对于我的echo服务器/客户机,当我的客户机与我的服务器对话时,在服务器echo的末尾总是有一些奇怪的额外字符 客户(发送): 服务器: rnet = recv(conn, recvbuf, recvbuflen, 0); if (rnet > 0) { srnet=send(conn, recvbuf, rnet, 0 ); if ( srnet== SOCKET_ERROR) { printf("[C

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

客户(发送):

服务器:

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
注意,每次输入“asdsa”时都会附加额外的p。而像“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);  
    }
}  
char recvbuf[DEFAULT_BUFLEN];
同时(rnet>0&&start){
rnet=recv(连接,recvbuf,recvbuflen,0);
如果(rnet>0&&rnet

我假设返回的
recv
值是接收到的缓冲区的长度。

或者,如果您不确定是否有多余的缓冲区空间,则最好:

printf("[RECR %s] %.*s\n", ip.c_str(), rnet, recvbuf);

如何从
recvbuf
提取和显示字符串?@MM。抱歉没有包括这一点。补充!谢谢!工作得很有魅力。有趣的是,我以前试过,但没有成功。我猜我把rnet搞错了,因为rnet-1太蠢了!谢谢@用户1611132:很高兴能帮助你。
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);  
    }
}  
printf("[RECR %s] %.*s\n", ip.c_str(), rnet, recvbuf);