[Linux]检测socket异常断开--keepalive

来源:互联网 发布:水果网络销售 编辑:程序博客网 时间:2024/06/10 03:29

参考文献:

http://www.tldp.org/HOWTO/html_single/TCP-Keepalive-HOWTO/#usingkeepalive

http://blog.csdn.net/jwybobo2007/article/details/6162784

#include<stdlib.h>#include<stdio.h>#include<netinet/in.h>#include<netinet/tcp.h>#include<netdb.h>#include<sys/socket.h>#include<sys/types.h>#include<unistd.h>#include<fcntl.h>#include<errno.h>#include<string.h>int main(const int argc,char* const argv[]){int socket_fd;struct sockaddr_in name;struct hostent *hostinfo;socket_fd = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);name.sin_family = AF_INET;hostinfo = gethostbyname(argv[1]);if(hostinfo == NULL) return -1;name.sin_addr = *((struct in_addr*)hostinfo->h_addr);name.sin_port = htons(atoi(argv[2]));if(connect(socket_fd,(struct sockaddr*)&name,sizeof(name))==-1) return -2;char buf[1024];ssize_t count;int sock_flag;int times=0;sock_flag = fcntl(socket_fd,F_GETFL);fcntl(socket_fd,F_SETFL,sock_flag|O_NONBLOCK);//write(socket_fd,"GET /\n",strlen("GET /\n"));int keepalive = 1;int keepidle = 5;int keepinterval = 3;int keepcount = 2;if(setsockopt(socket_fd,SOL_SOCKET,SO_KEEPALIVE,&keepalive,sizeof(keepalive))<0) return -3;if(setsockopt(socket_fd,SOL_TCP,TCP_KEEPIDLE,&keepidle,sizeof(keepidle))<0) return -4;if(setsockopt(socket_fd,SOL_TCP,TCP_KEEPINTVL,&keepinterval,sizeof(keepinterval))<0) return -5;if(setsockopt(socket_fd,SOL_TCP,TCP_KEEPCNT,&keepcount,sizeof(keepcount))<0) return -6;while(true){count=read(socket_fd,buf,1024);if(count>0) write(STDOUT_FILENO,buf,count);else if(count==-1 && errno==EAGAIN) {printf("%dth sleep 1s\n",++times);sleep(1);}else{printf("count=%d,errno=%d\n",count,errno);break;}}return 0;}


0 0
原创粉丝点击