zoukankan      html  css  js  c++  java
  • C++ Socket超时设置

    http://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套接字的状态。
    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
       {
             绑定成功
       }
  • 相关阅读:
    WSP部署错误—SharePoint管理框架中的对象“SPSolutionLanguagePack Name=0”依赖其他不存在的对象
    Elevate Permissions To Modify User Profile
    Error with Stsadm CommandObject reference not set to an instance of an object
    ASP.NET MVC3添加Controller时没有Scaffolding options
    测试使用Windows Live Writer写日志
    配置TFS 2010出现错误—SQL Server 登录的安全标识符(SID)与某个指定的域或工作组帐户冲突
    使用ADO.NET DbContext Generator出现错误—Unable to locate file
    CSS
    HTML DIV标签
    数据库
  • 原文地址:https://www.cnblogs.com/zhangmo/p/3768604.html
Copyright © 2011-2022 走看看