我有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个字节。
答案 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)
这是我错过的两个不同套接字上的两个不同线程中的共享缓冲区。