小v电子技术博文 上海鲤鲸网络科技 小v单片机 物联网云平台管理系统+终端嵌入式软硬件开发!
linux 下tcp连接超时崩溃问题
  • 首页 > Linux
  • 作者:小v
  • 2018年1月3日 16:47 星期三
  • 浏览:470
  • 字号:
  • 评论:0
    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. }  

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

      您阅读这篇文章共花了:  
     本文无需标签!
    二维码加载中...
    本文作者:小v      文章标题: linux 下tcp连接超时崩溃问题
    本文地址:http://www.xiaovdiy.cn/?post=388
    版权声明:若无注明,本文皆为“”原创,转载请保留文章出处。

    返回顶部| 首页| 手气不错| 捐赠支持| 自定义链接| 自定义链接| 自定义链接| 手机版本|后花园

    Copyright © 2014-2017   京ICP备14059411 Copyright 2014-2015 上海鲤鲸网络科技工作室 版权所有 All Rights Reserved

    sitemap