linux 下tcp连接超时崩溃问题

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <errno.h>  
  4. #include <string.h>  
  5. #include <sys/types.h>  
  6. #include <netdb.h>  
  7. #include <netinet/in.h>  
  8. #include <sys/socket.h>  
  9. #include <sys/wait.h>  
  10. #include <sys/time.h>  
  11. #include <unistd.h>  
  12. #include <asm/ioctls.h>  
  13. #include <signal.h>   
  14. #include <fcntl.h>  
  15.   
  16. #define SERVPORT 13333  
  17. #define TIMEOUT_TIME 6  
  18.   
  19. int main(int argc,char *argv[])  
  20. {  
  21.         int sockfd;  
  22.         int retval;  
  23.         int error=-1;  
  24.         char *dest_ip;  
  25.         int len;  
  26.         int ret=0;  
  27.         struct sockaddr_in serv_info;  
  28.         struct sigaction act,oldact;  
  29.         struct timeval tm;  
  30.         fd_set rset,wset;  
  31.         char buf[1024];  
  32.           
  33.         if(argc == 2)  
  34.         {  
  35.                 dest_ip=argv[1];  
  36.         }  
  37.   
  38.         memset(&serv_info,0,sizeof(serv_info));  
  39.         serv_info.sin_family = AF_INET;  
  40.         serv_info.sin_port = htons(SERVPORT);  
  41.         serv_info.sin_addr.s_addr = inet_addr(dest_ip);  
  42.         sockfd = socket(PF_INET,SOCK_STREAM,0);  
  43.         if(sockfd<0)  
  44.         {  
  45.                 perror("socket");  
  46.                 return 1;  
  47.         }  
  48.           
  49.         if(fcntl(sockfd,F_SETFL,fcntl(sockfd,F_GETFL) | O_NONBLOCK)<0)  
  50.         {  
  51.                 perror("fcntl");  
  52.                 close(sockfd);  
  53.                 return 1;  
  54.         }  
  55.                   
  56.           
  57.         if(connect(sockfd,(struct sockaddr *)&serv_info,sizeof(struct sockaddr))<0)  
  58.         {  
  59.                 if(errno != EINPROGRESS)  
  60.                 {  
  61.                         perror("connect");  
  62.                         return 1;  
  63.                 }  
  64.                 tm.tv_sec = TIMEOUT_TIME;  
  65.                 tm.tv_usec = 0;  
  66.                 FD_ZERO(&wset);  
  67.                 FD_SET(sockfd,&wset);  
  68.                 retval = select(sockfd+1,NULL,&wset,NULL,&tm);  
  69.                 switch(retval)  
  70.                 {  
  71.                         case -1:  
  72.                                 perror("select");  
  73.                                 return 1;  
  74.                         case 0:  
  75.                                 printf("timeout\n");  
  76.                                 break;  
  77.                         default:  
  78.                                 if(FD_ISSET(sockfd,&wset))  
  79.                                 {  
  80.                                         if(getsockopt(sockfd,SOL_SOCKET,SO_ERROR,&error,(socklen_t *)&len)<0)  
  81.                                         {  
  82.                                                 return 1;  
  83.                                         }  
  84.                                         printf("error=%d\n",error);  
  85.                                         if(error==0)  
  86.                                         {  
  87.                                                 ret=1;  
  88.                                         }  
  89.                                         else  
  90.                                         {  
  91.                                                 ret=0;  
  92.                                                 errno=error;  
  93.                                         }  
  94.                                 }  
  95.                                 break;  
  96.                 }  
  97.         }  
  98.           
  99.         fcntl(sockfd,F_SETFL,fcntl(sockfd,F_GETFL) & O_NONBLOCK); //set back to block mode  
  100.           
  101.         if(!ret)  
  102.         {  
  103.                 close(sockfd);  
  104.                 perror("connect failed");  
  105.                 return 1;  
  106.         }  
  107.           
  108.         sprintf(buf,"%s","hello world!");  
  109.           
  110.         if(send(sockfd,buf,strlen(buf),0)<0)  
  111.         {  
  112.                 perror("send");  
  113.         }  
  114.           
  115.         printf("connected\n");  
  116.         return 0;          

  1. }  

通过设置为超时非阻塞,可不再使程序崩溃

sitemap