我的服务器正在向客户端发送数据包,但未显示第二个数据包。
我不知道如果我的套接字是阻塞类型,为什么会发生这种情况。
while(1){
memset(buf,0,1024);
numbytes=0;
if ((numbytes = recv(sockfd, buf, 1024, 0)) == -1) {
perror("recv");
exit(1);
}
buf[numbytes] = '\0';
printf("%s\n",buf);
fflush(stdout);
}
fclose(fp);
close(sockfd);
最佳答案
发生这种情况是因为您的服务器发送了一个空字符串。因此,您的客户端不会阻塞,因为它收到了'\0'
字符,并且由于它是一个空字符串而不会打印任何内容。
第二个原因可能是因为您的服务器关闭了连接。在这种情况下,numbytes
的值为零,并且您的客户端将不打印任何内容,因为您最终在缓冲区中还带有一个空字符串。
代码的一个问题是,如果服务器发送1024个字节或更多,则numbytes
等于1024,如果缓冲区大小也等于1024,则表达式buf[numbytes]
会引起分段错误。通过接收1023而不是1024来解决此问题。