C++ Socket超时设置

C++ Socket超时设置

用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套接字的状态。
C++ 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);//设置为非阻塞连接
C++ Socket超时设置
 
 
下面开始进行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与端口的,操作系统会自动给你分配端口,然后根据路由自动选择出口。
但是当你想主动根据不同的数据去选择不同的网卡发送时,我们应该怎么做呢。
 
答案很简单,
C++ Socket超时设置
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 { 绑定成功 }
C++ Socket超时设置

  转载请注明原连接www.cnblogs.com/gaoteng/p/3767967.html 雪狼的个人博客

用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套接字的状态。
C++ 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);//设置为非阻塞连接
C++ Socket超时设置
 
 
下面开始进行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与端口的,操作系统会自动给你分配端口,然后根据路由自动选择出口。
但是当你想主动根据不同的数据去选择不同的网卡发送时,我们应该怎么做呢。
 
答案很简单,
C++ Socket超时设置
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 { 绑定成功 }
C++ Socket超时设置

  转载请注明原连接www.cnblogs.com/gaoteng/p/3767967.html 雪狼的个人博客