2

我有 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

4 回答 4

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
于 2012-06-13T19:59:56.830 回答
1

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

于 2012-06-13T19:58:24.463 回答
0

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

于 2012-06-14T14:28:13.703 回答
0
strace -e trace=recv -s 65535 -v -p PID

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

于 2012-06-13T19:42:21.340 回答