用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 = ;//秒
timeout.tv_usec = ;//一百万分之一秒,微秒 u_long ul=;//代表非阻塞
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();//本地端口
if( - == bind(sockClient[i],(SOCKADDR*)&addrSelf,sizeof(SOCKADDR)))//把网卡地址强行绑定到Soket
{
绑定成功
}

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

C++ Socket超时设置的更多相关文章

  1. python socket 超时设置 errno10054

    python socket.error: [Errno 10054] 远程主机强迫关闭了一个现有的连接.问题解决方案: 前几天使用python读取网页.因为对一个网站大量的使用urlopen操作,所以 ...

  2. [转] python 远程主机强迫关闭了一个现有的连接 socket 超时设置 errno 10054

    python socket.error: [Errno 10054] 远程主机强迫关闭了一个现有的连接.问题解决方案: 前几天使用python读取网页.因为对一个网站大量的使用urlopen操作,所以 ...

  3. php socket 超时设置

    1.php创建socket的方法和设置超时的方法,贴出来分享一下 //如果$waitAckSec=0,则返回成功发送的字节�? //如果$waitAckSec大于0,则返回发送后接收到得内容 //任何 ...

  4. C# Socket连接超时设置

    问题描述:         对于C# Socket没有超时设置的选项,默认情况下进行Socket连接,返回连接失败需要20-30s时间,严重影响用户体验 问题解决: Socket服务器端: Socke ...

  5. Socket编程实践(9) --套接字IO超时设置方法

    引:超时设置3种方案 1. alarm超时设置方法 //代码实现: 这种方式较少用 void sigHandlerForSigAlrm(int signo) { return ; } signal(S ...

  6. connect socket的超时设置

    最近项目中,有个需求是检测某ip地址是否是通的,使用了socket的connect函数.但是,当ip地址写错的话,connect就会一直阻塞在那里,大概2.3分钟才能返回连接失败.这对于用户来说是不可 ...

  7. PHP socket 编程中的超时设置

    PHP socket 编程中的超时设置.网上找了半天也没找到.贴出来分享之:设置$socket 发送超时1秒,接收超时3秒: $socket = socket_create(AF_INET,SOCK_ ...

  8. JAVA Socket超时浅析

    JAVA Socket超时浅析 套接字或插座(socket)是一种软件形式的抽象,用于表达两台机器间一个连接的"终端".针对一个特定的连接,每台机器上都有一个"套接字&q ...

  9. 使用select io复用实现超时设置

    在linux的socket编程中,经常会遇到超时设置的问题,例如请求方如果在Ks内不发送数据则服务器要断开连接停止服务.这里我使用select的io复用实现超时5s设置,具体代码片段如下: fd_se ...

随机推荐

  1. 数往知来 JavaScript<十三>

    一.javaScript 语法:大小写敏感,弱类型(所有类型都用var进行引导.声明) 写在<script></script>标签里  不可以放在title里 var num= ...

  2. jQuery文档加载完毕的几种写法

    js中文档加载完毕.一般在body加一个onload事件或者window.onload = function () {} jQuery中有好多写法,平时也不注意,别人一问,还真觉得头大. 下面是我整理 ...

  3. JavaScript基础知识整理(1)数组

    第一:创建. 1,var arr= new Array(); //数组为空.长度为0. arr[0]="apple"; arr[1]="orange"; arr ...

  4. ShellExecute的各种用法

    一.利用系统默认的邮件收发器发送电子邮件 Uses ..., ShellAPI; Var lpHwnd: HWND; lpOperation, lpFile, lpParameters, lpDire ...

  5. Google软件测试

    google测试相关的职位有三类:软件测试开发工程师.测试工程师以及测试工程经理. 软件测试开发工程师也是一个开发角色,只是工作重心在可测试性和通用测试框架上.他们参与设计评审,非常近距离地观察代码质 ...

  6. Java多线程学习总结--线程概述及创建线程的方式(1)

    在Java开发中,多线程是很常用的,用得好的话,可以提高程序的性能. 首先先来看一下线程和进程的区别: 1,一个应用程序就是一个进程,一个进程中有一个或多个线程.一个进程至少要有一个主线程.线程可以看 ...

  7. CentOS7 network

  8. Represent nil with NSNull

    [Represent nil with NSNull] It’s not possible to add nil to the collection classes described in this ...

  9. What's Exposure?

    [What's Exposure?] ISO:即相机的感光度.ISO数值的大小是DC对光线反应的敏感程度测量值,通常以ISO数值表示,数值越大表示对光线的敏感性越强,数值越小表示越弱,是控制曝光量的一 ...

  10. Java断言assert

    public class Welcome{ public static void main(String[] args){ assert false; System.out.println(" ...