如何判断SOCKET已经断开
展开全部
非阻塞模式,如果暂时没有数据,返回的值也会是<=0的,如果用阻塞模式的话,返回<=0的值是可以认为socket已经无效了。
当使用 select()函数测试一个socket是否可读时,如果select()函数返回值为1,
且使用recv()函数读取的数据长度为0 时,就说明该socket已经断开。
如果write,我觉得还有一些情况需要考虑,那就是写的太快的时候,有可能buffer写满了,这是,errno是EAGAIN,可以根据实际需要,如果errno是EAGAIN的话,再写几次。
当然,read的时候也有类似write的情况,需要check一下errno,如果是EAGAIN或者EINTR,最好不要立刻终止操作,再尝试一下!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
int SocketConnected(int sockfd)
{
fd_set rfds;
int res,read_res;
char buf[20] = {'\0'};
struct timeval timeout={3,0};
int again_time = 0;
FD_ZERO(&rfds);
FD_SET(sockfd,&rfds);
res = select(sock+1,&rfds,NULL,NULL,&timeout)
if(res > 0){
read_res = recv(sockfd,buf,sizeof(buf),0);
if(read_res < 0){
if(errno == EINTR){
printf("Interrupted by the signal!\n");
return 1;
} else {
printf("error!,the sockfd maybe closed!\n");
return 0;
}
} else if (read_res == 0){
printf("error!,the sockfd maybe closed!\n");
return 0;
} else {
printf("contenct normal!\n");
return 1;
}
} else if(res == 0){
printf("the timeout! content normal\n");
return 1;
} else if (errno == EINTR){
printf("Interrupted by the signal!\n");
return 1;
} else {
printf("select error!,try again!\n");
return 0;
}
}
当使用 select()函数测试一个socket是否可读时,如果select()函数返回值为1,
且使用recv()函数读取的数据长度为0 时,就说明该socket已经断开。
如果write,我觉得还有一些情况需要考虑,那就是写的太快的时候,有可能buffer写满了,这是,errno是EAGAIN,可以根据实际需要,如果errno是EAGAIN的话,再写几次。
当然,read的时候也有类似write的情况,需要check一下errno,如果是EAGAIN或者EINTR,最好不要立刻终止操作,再尝试一下!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
int SocketConnected(int sockfd)
{
fd_set rfds;
int res,read_res;
char buf[20] = {'\0'};
struct timeval timeout={3,0};
int again_time = 0;
FD_ZERO(&rfds);
FD_SET(sockfd,&rfds);
res = select(sock+1,&rfds,NULL,NULL,&timeout)
if(res > 0){
read_res = recv(sockfd,buf,sizeof(buf),0);
if(read_res < 0){
if(errno == EINTR){
printf("Interrupted by the signal!\n");
return 1;
} else {
printf("error!,the sockfd maybe closed!\n");
return 0;
}
} else if (read_res == 0){
printf("error!,the sockfd maybe closed!\n");
return 0;
} else {
printf("contenct normal!\n");
return 1;
}
} else if(res == 0){
printf("the timeout! content normal\n");
return 1;
} else if (errno == EINTR){
printf("Interrupted by the signal!\n");
return 1;
} else {
printf("select error!,try again!\n");
return 0;
}
}
迪凯特科技(北京)有限公司
2023-07-28 广告
2023-07-28 广告
要从电脑的一个串行口接收数据并将其从另一个串行口发送出去,你可以使用以下步骤:1. 确定你要使用的两个串行口。在大多数计算机上,串行口通常被称为COM1、COM2等。确保你了解每个串行口的名称或编号。2. 编写一个程序来读取来自一个串行口的...
点击进入详情页
本回答由迪凯特科技(北京)有限公司提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询