非阻塞socket编程问题小结

本文总结了非阻塞socket编程中的关键问题,包括:1)理解非阻塞connect返回值,尤其是EINPROGRESS状态;2)设置select超时的重要性,避免因目标端口未打开而浪费时间;3)send/recv返回值的处理,如何应对EAGAIN和EINTR错误;4)关闭socket时的数据发送处理,使用SO_LINGER确保数据完整发送。
摘要由CSDN通过智能技术生成

项目需要写一个主动连接且定时发送数据的客户端程序,并保证传输数据的可靠性和稳定性。

注意的问题有:

1.connect返回值判定

之前的程序

if(connect(tcp_client_sock,(struct sockaddr*)&server, server_length) < 0)

//向服务器发起连接,连接成功后client_socket代表了客户机和服务器的一个socket连接
      {
        printf("Can Not Connect To %s!\n",SERVE_IP);
        close(tcp_client_sock);

    return -1;
        //exit(1);
      }
      else
      {
      TCP_CONNET_FLAG = 1;//建立连接

...

}

但是在网上查询发现:当我们以非阻塞的方式来进行连接的时候,返回的结果如果是 -1,这并不代表这次连接发生了错误,如果它的返回结果是 EINPROGRESS,那么就代表连接还在进行中。后面可以通过poll或者select来判断socket是否可写,如果可以写,说明连接完成了。

更改如下:

//先定位为非阻塞模式,立即返回状态;如有错误存为SO_ERROR值     

if((flags = fcntl(tcp_client_sock,F_GETFL, 0 )) < 0)
         {
        perror("fcntl");
        return -1;
         }
         flags |= O_NONBLOCK;
         if(fcntl(tcp_client_sock, F_SETFL, flags) < 0 )//设置socket为非阻塞模式
        {
          perror("fcntl");
          return -1;
        }

 

 if(connect(tcp_client_sock,(struct sockaddr*)&server, server_length) < 0) //向服务器发起连接
        {   

        if (errno != EINPROGRESS)//非等待状态
            {
              perror("connect error");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值