C套接字recv返回字节数但缓冲区中没有任何内容

时间:2012-06-13 19:16:17

标签: c sockets network-programming

我有2个程序客户端和服务器。客户端发送一个4字节的ascii命令

client command: BD?\r
server reads: 

服务器代码

while(1) {

    int numbytes = 0;
    printf("MAIN: waiting for commands\n");
    memset(theRecvBuffer, '\0', THE_BUFFER_SIZE);
    numbytes = recv(theCSock, theRecvBuffer, THE_BUFFER_SIZE, 0);
    if(numbytes == 0) {
        printf("client socket closed\n");
        break;
    }
    if(numbytes == -1) {
        printf("cmd loop received socket error: %s\n", strerror(errno));
        break;
    }
}

服务器的recv调用返回4个字节,但缓冲区填充NULL字节。 有什么可能导致recv调用丢失缓冲区信息吗? 无论如何我可以使用print语句调试recv调用中发生的事情吗? 我受限制,因为这个程序是在具有不同芯片组的设备上,所以我不能使用调试器。 errno没有帮助,因为它没有错误,因为它返回4个字节。

4 个答案:

答案 0 :(得分:1)

如果您使用多个线程,则在您的memset函数在主循环中将其归零之前,另一个线程可能无法读取您的缓冲区。这只是猜测,但没有完整的代码,很难给出一定的答案。

答案 1 :(得分:1)

如果您的代码片段实际上是从您的代码中获取的(我怀疑),那么问题显而易见:在每次调用recv之前清除缓冲区。读4个字节

clear buffer
recv() = 4
not 0 (eof)
not -1 (error)
loop
clear buffer
recv() = 0
is 0 (eof)
break
loop exits with cleared buffer

答案 2 :(得分:0)

strace -e trace=recv -s 65535 -v -p PID

应该在用户空间再次查看之前显示系统调用之后缓冲区的样子。 -s是要捕获的字符串的缓冲区大小。如果它是二进制数据,-x可能会有用。

答案 3 :(得分:0)

这是我错过的两个不同套接字上的两个不同线程中的共享缓冲区。