C++ Socket超时设置

http://www.cnblogs.com/gaoteng/p/3767967.htmlhtml

 

用winsocket时,send(),recv()过程当中有时因为网络情况等缘由,收发不能预期进行,能够设置收发时限:
int nNetTimeout = 1000; //1秒
//发送时限
setsockopt( socket, SOL_SOCKET, SO_SNDTIMEO, ( char * )&nNetTimeout, sizeof( int ) );
//接收时限
setsockopt( socket, SOL_SOCKET, SO_RCVTIMEO, ( char * )&nNetTimeout, sizeof( int ) );网络

 
可是当咱们的客户端经过connect 函数链接服务端时,这时超时时间很长,那咱们应该如何设置connect的超时时间呢?
 
查资料后发现,select方法能够查询socket套接字的状态。
fd_set rfd;      //描述符集 这个将测试链接是否可用
struct timeval timeout;  //时间结构体
FD_ZERO($rfd);//先清空一个描述符集
timeout.tv_sec = 60;//
timeout.tv_usec = 0;//一百万分之一秒,微秒
 
u_long ul=1;//表明非阻塞
ioctlsocket(socket,FIONBIO,$ul);//设置为非阻塞链接
下面开始进行connect
connect(socket,(SOCKADDR*)&addrClient,sizeof(SOCKADDR))
 
FD_SET(sock,&rfd);
链接以后将socket添加到描述符rfb中,这样就能够对这个socket进行测试了。一个描述符能够添加多个socket
下面执行select函数,进行查询
ret = select(0, 0, &rfd, 0, &timeout);
if(ret<=0)
{
     说明超时,仍然没有链接成功
     而后能够在程序中作相应的处理
}
若是在超时时间以内链接成功
则将socket从新设置为阻塞状态
以下
ul = 0;
ioctlsocket(socket,FIONBIO,&ul);
 下面就能够进行正常的recv与send操做了。
 
顺便记录下,多网卡发送数据的操做。
 
当客户端去主动链接服务端的时候(TCP),默认是不须要指定,本地的ip与端口的,操做系统会自动给你分配端口,而后根据路由自动选择出口。
可是当你想主动根据不一样的数据去选择不一样的网卡发送时,咱们应该怎么作呢。
 
答案很简单,
SOCKADDR_IN addrSelf;//本地地址  
 addrSelf.sin_addr.s_addr = inet_addr("192.168.1.110");//指定网卡的地址  
 addrSelf.sin_family = AF_INET;   addrSelf.sin_port = htons(20000);//本地端口  
  if( -1 == bind(sockClient[i],(SOCKADDR*)&addrSelf,sizeof(SOCKADDR)))//把网卡地址强行绑定到Soket
   {
         绑定成功
   }
相关文章
相关标签/搜索