VC中将SOCKET类的connect函数设置为非堵塞

本文介绍了在VC环境下,如何通过ioctlsocket函数将CSocket类的connect函数设置为非阻塞模式,避免在服务器未运行时connect函数长时间阻塞程序。通过设置FIONBIO标志并配合select函数实现超时控制,确保连接超时后能够立即返回。
摘要由CSDN通过智能技术生成

windows的socket在创建后,默认是阻塞调用的,也就是说函数recv,recvfrom,send,sendto等函数都是阻塞的;那么我们如何将他们设置成非阻塞调用呢?我们可以通过windows为我们提供的ioctlsocket 函数实现;

 

CSocket类中的connect等函数都是默认为阻塞方式的,也就是说,它不达到目的就不走,在程序中就会出现像死机一样的状况,很是不爽。在这里给出一种设置connect函数为非阻塞方式的方法,代码很简单,且慢慢来看。
SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);//先创建套接字
if(sock == INVALID_SOCKET)
{
  AfxMessageBox("创建套接字失败!");
  return 0;
}
SOCKADDR_IN addrTo;
addrTo.sin_family=AF_INET;
addrTo.sin_port=htons(4000);
addrTo.sin_addr.S_un.S_addr=inet_addr(ip);
    //--------------------------------------------------------------------------
    //设置为非阻塞方式连接
    unsigned long ul = 1;
    int err;
    int ret = ioctlsocket(sock, FIONBIO, (unsigned long*)&ul);
    if(ret == SOCKET_ERROR)
    {
        err = WSAGetLastError();
  closesocket(sock);
  sock = NULL;
  return FALSE;
    }

TIMEVAL timeval;
    fd_set r;                     

    FD_ZERO(&r);
    FD_SET(sock, &r);
   

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值