我有一个听套接字的简单程序。除了在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);
}
}
}发布于 2015-12-28 12:41:56
更改:
if (br>0)
{
printHex(str);
}至:
if (br<=0) break;
printHex(str);此外,您的代码错误地处理了第一个字节为零的情况。您无法避免这种情况,因为TCP不保留应用程序消息边界。您应该将br传递给printHex,这样它就会知道要打印多少个字符。
发布于 2015-12-28 12:41:50
您需要检查read()的结果。如果连接关闭,您将得到该连接的返回代码。
来自手册页
如果出现错误,则返回-1,并适当设置errno。
https://stackoverflow.com/questions/34493714
复制相似问题