设为首页 收藏本站
查看: 982|回复: 0

[经验分享] windows下设置socket的connect超时

[复制链接]

尚未签到

发表于 2018-6-21 08:33:02 | 显示全部楼层 |阅读模式
// widonws: 默认设置socket TCP client connect为阻塞模式  
void TcpConnect(char* strIP, UINT nPort)
  
{
  
    struct sockaddr_in serverAddress;
  
    SOCKET hSocket = NULL;
  

  
    hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  
    if( hSocket==INVALID_SOCKET)
  
    {
  
        return;
  
    }
  

  
    memset(&serverAddress, 0, sizeof(serverAddress));
  
    serverAddress.sin_family      = AF_INET;
  
    serverAddress.sin_addr.s_addr = inet_addr(strIP);
  
    serverAddress.sin_port        = htons((short)nPort);
  
    int iTimeOut = 3000;
  
    setsockopt(hSocket,SOL_SOCKET,SO_RCVTIMEO,(char*)&iTimeOut,sizeof(iTimeOut));
  
    setsockopt(hSocket,SOL_SOCKET,SO_SNDTIMEO,(char*)&iTimeOut,sizeof(iTimeOut));
  

  
    if( SOCKET_ERROR==connect(hSocket, (sockaddr*)&serverAddress, sizeof(serverAddress)) )
  
    {
  
        closesocket(hSocket);
  
        DWORD gle = WSAGetLastError();
  

  
        return;
  
    }
  

  
    char buff[] = "hello";
  
    int sl=::send(hSocket,(char*)buff, sizeof(buff), 0);
  
    if( sl<0 )
  
    {
  
        closesocket(hSocket);
  
        return ;
  
    }
  
    closesocket(hSocket);
  
}
  

  
// widonws: 设置socket TCP client connect非阻塞模式
  
void SockSelect(char* strIP, UINT nPort)
  
{
  
    SOCKET/*int*/ sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  
    if(sockfd < 0)
  
    {
  
        return;
  
    }
  
    struct sockaddr_in serv_addr;
  

  
    //以服务器地址填充结构serv_addr
  
    serv_addr.sin_family = AF_INET;
  
    serv_addr.sin_addr.s_addr = inet_addr(strIP);
  
    serv_addr.sin_port = htons(nPort);
  
    int error = -1;
  
    int len = sizeof(int);
  
    timeval tm;
  
    fd_set set;
  
    unsigned long ul = 1;
  
    ioctlsocket(sockfd, FIONBIO, &ul); //设置为非阻塞模式
  
    bool ret = false;
  
    if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1)
  
    {
  
        tm.tv_sec  = 3;
  
        tm.tv_usec = 0;
  
        FD_ZERO(&set);
  
        FD_SET(sockfd, &set);
  
        if( select(sockfd+1, NULL, &set, NULL, &tm) > 0)
  
        {
  
            getsockopt(sockfd, SOL_SOCKET, SO_ERROR, (char *)&error, /*(socklen_t *)*/&len);
  
            if(error == 0)
  
                ret = true;
  
            else
  
                ret = false;
  
        }
  
        else
  
            ret = false;
  
    }
  
    else
  
        ret = true;
  
    ul = 0;
  
    ioctlsocket(sockfd, FIONBIO, &ul); //设置为阻塞模式
  
    if(!ret)
  
    {
  
        closesocket( sockfd );
  
        fprintf(stderr , "Cannot Connect the server!/n");
  
        return;
  
    }
  

  
    fprintf( stderr , "Connected!/n");
  

  
    char buff[] = "hello";
  
    int sl=::send(sockfd,(char*)buff, sizeof(buff), 0);
  

  
    closesocket( sockfd );
  
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-528523-1-1.html 上篇帖子: windows server 2008的FTP服务器的搭建 下篇帖子: UEFI引导Windows启动(3)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表