- 论坛徽章:
- 0
|
在程序中如何检测出网络断开(直接拔掉网线来测试)?
1\只有在getsockopt,SO_SNDTIMEO情况下write 会回返回-1,errno为EGAIN,但这个错误码也应该会在网络祖塞情况下产生,不能用来作为断开的条件.
2\用select超时则select会超时,超时不能作为断开的条件.
3\bleem1998
天使的程序我看一下,多谢.
补充,测试程序及条件如下:
1\
#include <sys/types.h>;
#include <sys/socket.h>;
#include <netinet/in.h>;
#include <unistd.h>;
int main(int argc,char **argv)
{
int mysocket;
int acceptport;
struct sockaddr_in inaddr,outaddr;
int port;
mysocket = socket(PF_INET, SOCK_STREAM, 0);
inaddr.sin_family = AF_INET;
inaddr.sin_port = htons(5060);
inaddr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(mysocket,(struct sockaddr *)&inaddr,sizeof(inaddr));
listen(mysocket, 10);
int len = sizeof(outaddr);
acceptport = accept(mysocket, (struct sockaddr *)&outaddr, &len);
struct timeval oldval,newval;
int status;
/* int lentime=sizeof(oldval); */
/* status = getsockopt(acceptport, SOL_SOCKET, SO_SNDTIMEO, &oldval, &lentime); */
/* printf("the sndtimeo is:%d,%d\n",oldval.tv_sec,oldval.tv_usec); */
/* newval.tv_sec=3; */
/* newval.tv_usec=0; */
/* status = setsockopt(acceptport, SOL_SOCKET, SO_SNDTIMEO, &newval, lentime); */
char content[1000]="Test!!!\r\n";
char buff[50];
while (1)
{
status = write(acceptport, content, sizeof(content));
perror("The errno is:" ;
// status =read (acceptport, buff, 50);
// printf("read %d, and %s",status, buff);
//perror("read error." ;
sleep(2);
}
return 1;
}
2\
#include <netinet/in.h>;
#include <sys/socket.h>;
#include <sys/types.h>;
#include <errno.h>;
#include <unistd.h>;
int main(int argc, char **argv)
{
int mysocket;
struct sockaddr_in outaddr;
int status;
mysocket = socket (PF_INET, SOCK_STREAM, 0);
outaddr.sin_family = AF_INET;
outaddr.sin_port = htons(5060);
outaddr.sin_addr.s_addr = inet_addr("19.80.116.125" ;
connect(mysocket, (struct sockaddr *)&outaddr, sizeof(outaddr));
char buff[50];
int len;
while(1)
{
len = read(mysocket, buff, 50);
// perror("the end is." ;
buff[len] = '\0';
// printf("the recv content is:%s\n",buff);
len = write(mysocket,buff,len);
perror("write error" ;
sleep(2);
}
return 1;
}
测试方法:联上后修改一端的ip来模拟cdma断线重拨
现象:网络连接一直不会断开,ifconfig显示已经修改,netstat 显示连接存在. |
|