我有一个监听套接字的简单程序。一切都很顺利,除非在while(1)
周期中连接丢失。在这种情况下,程序会多次从套接字读取而没有结果。如何在while(1)
周期中检测断开连接的客户端?
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include<string.h>
void printHex(char * bts )
{
char *s = bts;
int i=0;
do
{
printf("%02X ", (unsigned char ) *bts);
} while (* ++bts !=0);
printf("%s\n",s);
}
int main()
{
char str[100];
int listen_fd, comm_fd;
struct sockaddr_in servaddr;
listen_fd = socket(AF_INET, SOCK_STREAM, 0);
bzero( &servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htons(INADDR_ANY);
servaddr.sin_port = htons(22000);
printf("binding\n");
bind(listen_fd, (struct sockaddr *) &servaddr, sizeof(servaddr));
printf("listening\n");
listen(listen_fd, 10);
printf("accepting\n");
comm_fd = accept(listen_fd, (struct sockaddr*) NULL, NULL);
printf("accep done\n");
int cn =0;
while(1)
{
bzero( str, 100);
printf("will read\n");
int br= read(comm_fd,str,100);
printf("read done\n");
if (br>0)
{
printHex(str);
}
}
}
答案 0 :(得分:2)
变化:
if (br>0)
{
printHex(str);
}
要:
if (br<=0) break;
printHex(str);
此外,您的代码错误处理了第一个字节为零的情况。并且您无法避免这种情况,因为TCP不会保留应用程序消息边界。您应该将br
传递给printHex
,以便知道要打印的字符数。
答案 1 :(得分:0)