当前位置:  技术问答>linux和unix

socket 连接超时的问题

    来源: 互联网  发布时间:2016-05-16

    本文导语:  //------------------------------------------------------------------- //--非阻塞状态的connect函数 int CSocketDevice::Connect_nonblock(unsigned long Ip, unsigned short Port) {     enum BLOCK_FLAG     { NON_BLOCK=1, BLOCK=0,     };     int iRet;     int error=...

//-------------------------------------------------------------------
//--非阻塞状态的connect函数
int CSocketDevice::Connect_nonblock(unsigned long Ip, unsigned short Port)
{
    enum BLOCK_FLAG
    {
NON_BLOCK=1,
BLOCK=0,
    };
    int iRet;
    int error=-1;
    int len=sizeof(int);

    sockaddr_in srv_sockaddr;
    srv_sockaddr.sin_family=AF_INET;
    srv_sockaddr.sin_addr.s_addr=Ip;
    srv_sockaddr.sin_port=htons(Port);

    unsigned long ulblock_flag=NON_BLOCK;      
    ioctl(this->Sock, FIONBIO, &ulblock_flag);
    bool bRet=false;
    iRet=connect(this->Sock, (struct sockaddr*)&srv_sockaddr, sizeof(srv_sockaddr));
    if(iRet==-1)
    {
if(errno == EINPROGRESS)
{
            timeval timeout;
    timeout.tv_sec  = TIMEOUT_SEC;
    timeout.tv_usec = TIMEOUT_USEC;
    fd_set write_set;
    FD_ZERO(&write_set);
    FD_SET(this->Sock,&write_set);
    iRet=select(this->Sock+1,NULL,&write_set,NULL,&timeout);
    if(iRet>0)           //good connect
    {
bRet=true;
    }
    else if(iRet == 0)   //my time out, but no socket error
    {
printf("==Connect() time out!n");
bRet=false;
    }
    else                 //socket error
    {
getsockopt(this->Sock,SOL_SOCKET,SO_ERROR,&error,(socklen_t*)&len);
if(error==0)
{
    bRet=true;
}
else
{
    bRet=false;
}     }   
}
else
{
    bRet=false;
}              
    }
    else
    {
bRet=true;
    }
    //ulblock_flag=BLOCK;
    //ioctl(this->Sock, FIONBIO, &ulblock_flag);
    //-----------------------------------------------------------

    if(bRet==true)
    {
return 0;
    }
    return -1;
}

请教一下为什么在select()返回-1的时候要调用getsockopt()函数,并且为什么getsockopt()的error返回0的时候认为是连接成功呢?

|
 非阻塞情况下当套接字连接成功时 select返回描述字是可写的,连接错误了则返回的是可读写的,至于什么错误只好getsockopt


|
select 返回-1的时候, 不一定是因为套接口出错了, 有可能是因为信号中断了系统调用, 所以使用getsockopt来判断套接口是否有错误发生

|
请教一下为什么在select()返回-1的时候要调用getsockopt()函数,并且为什么getsockopt()的error返回0的时候认为是连接成功呢?
select失败与该socket的描述字连接返回的状态无关啊.select返回-1失败后,调用getsockopt()函数只是测试一下select的错误是否是socket本身引起的.若无关则认为返回成功应该是合理的啊.

    
 
 

您可能感兴趣的文章:

  • epoll,socket超时如何设置?
  • 求教一个socket超时的问题
  • 关于Socket编程:如何设置超时?
  • 关于Socket中connect连接host的超时问题,急!!!
  • 如何设置linux下socket的2MS超时(会者不难的简单问题)????
  • 求linux下 设置socket接收超时的方法
  • socket的select使用超时的问题
  • Linux下Socket接收超时和主机端口 如何区分
  • C# Socket连接请求超时机制实现代码分享
  • 求助socket超时控制编程的问题(java)!!!!急急!!!!
  • python socket 超时设置 errno 10054 iis7站长之家
  • 如何设置Socket链接超时,在线等,一定给分!
  • python socket 超时设置 errno 10054
  • 两个 Socket 互相通信,其中一个如何判断另一个 Socket 是否已经意外断开了连接?
  • socket 断开连接如何再恢复连接
  • 什么是socket的长连接,以及如何实现长连接,长连接和短连接有什么区别?
  • kjava能不能通过socket连接服务器
  • socket 连接问题(不要见笑)
  • 如何跨网段进行socket连接
  • socket连接建立,收不到告警的情况?netstat结果如下
  • 服务器与客户端建立socket连接,如何获得端口号.谢谢
  • ftp连接出现socket错误=#10054的解决方法
  • 如何清楚linux系统中以退出程序的socket连接?
  • Socket连接的时间不能控制??请帮小妹
  • http连接,服务器端关闭socket
  • 请问javaBean能不能进行非本机的socket连接
  • 200分求问j2me里如何建立socket连接?
  • Linux下的Socket通信如何断开连接的端口从而实现重复使用该端口
  • 一个进程打开的socket长连接能否达到10000个
  • socket怎样限制客户端连接数?
  • 关于LINUX SOCKET连接CPU占用问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux socket问题。。怎样获得已帮定特定port的一个套接字socket
  • 关于socket概念的理解问题!
  • socket编程 中的bind问题
  • 你是否可以回答Socket的问题?数据先后问题
  • 多进程socket编程问题
  • Socket的问题
  • socket accept问题,大家指教。
  • socket客户端程序的问题
  • 关于多网口socket通信的简单问题
  • fgets用在SOCKET流上的问题
  • linux socket fd 写阻塞问题
  • linux下用socket实现多进程间通信问题?
  • 请教:多线程使用同一个socket进行数据收发会出现什么问题?
  • sco unix下socket编程的问题,请大家帮忙
  • 请问socket方面的问题
  • socket编程中的问题,请各位大侠指教!
  • 急!!请教关于linux socket编程的一个问题!!
  • socket编程,使用recvfrom()函数监听问题。
  • linux下socket编程问题!
  • 请教两个小问题:一个cgywin下使用vi的问题,另一个socket的问题
  • java命名空间java.net类socket的类成员方法: socket定义及介绍
  • re socket编程中 ACCEPT返回的socket与原socket(他参数中的)端口号一样吗?
  • java命名空间java.nio.channels类socketchannel的类成员方法: socket定义及介绍
  • libevent2需要从socket读一段数据写入一个socket中,同时发送给另一个socket
  • java命名空间java.nio.channels类serversocketchannel的类成员方法: socket定义及介绍
  • socket 通讯开发包 Simple Sockets
  • java命名空间java.nio.channels类datagramchannel的类成员方法: socket定义及介绍
  • C++ Socket 库 C++ Sockets
  • java命名空间java.net类socket的类成员方法: getsendbuffersize定义及介绍
  • vc做的的socket应用和unix下socket?
  • java命名空间java.net类socket的类成员方法: getreceivebuffersize定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3