select方法设置socket 连接超时

1、将套接字设置为非阻塞模式

2、conncect连接服务器,会立即返回

3、select方法判断是否连接成功。成功,返回值大于0.否则,在超时,会返回,返回值小于等于0

4、将套接字重新设置为非阻塞

代码如下:


int CSelctSock::Connect(string strIp, int nPort)
{
 sockaddr_in service;
 service.sin_family = AF_INET;
 service.sin_addr.s_addr = inet_addr(strIp.c_str());
 service.sin_port = htons(nPort);
 int nSize = sizeof(sockaddr_in);

 FD_SET fdWrite;
 FD_SET fdRead;
 FD_SET fdError;


 while(1)
 {
  FD_ZERO(&fdWrite);

  FD_SET(m_sockClient,&fdWrite);

  timeval timeout;
  timeout.tv_sec =3;//3秒
  timeout.tv_usec =0;
  int nRect;
  
  
  int iMode =1;//非阻塞
  ioctlsocket(m_sockClient, FIONBIO, (u_long FAR*) &iMode);
 
  connect(m_sockClient,(sockaddr*)&service, nSize);
  //cout << "connect :" << GetLastError() <<endl;
  
  if((nRect =select(0,NULL,&fdWrite,NULL,&timeout)) <= 0 )//FD_WRITE 的一个作用是,在非阻塞条件时,进行连接成功,可以获取到集合值
  {
   cout << "select error" <<nRect<< endl;//错误
  }
  else
  {
   cout << "ok" <<nRect<< endl;
   break;
  }

  Sleep(2000);

 }

 int iMode =0;//阻塞
 ioctlsocket(m_sockClient, FIONBIO, (u_long FAR*) &iMode);


 return 0;
}

你可能感兴趣的:(select方法设置socket 连接超时)