SOCKET Open(const char* strIP, UINT nPort, int nTimeOut)
    {
        SOCKET sockfd = NULL;
        
        do
        {
            sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
            if (sockfd <= 0)
            {
                printf("socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) error=%d\n", WSAGetLastError());
                break;
            }

unsigned long opt = 1;
            //set non-blocking
            if (ioctlsocket(sockfd, FIONBIO, &opt) < 0)
            {            
                printf("ioctlsocket(FIONBIO, %d) error=%d\n", opt, WSAGetLastError());
                break;
            }
                    
            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);

if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(struct sockaddr)) == -1)
            {
                if (WSAGetLastError() == WSAEWOULDBLOCK)
                {
                    int error = -1;
                    int len = sizeof(int);

timeval tv_timeout;
                    tv_timeout.tv_sec  = 0;
                    tv_timeout.tv_usec = nTimeOut * 1000;

fd_set set;
                    FD_ZERO(&set);
                    FD_SET(sockfd, &set);

if (select(sockfd + 1, NULL, &set, NULL, &tv_timeout) > 0)
                    {
                        getsockopt(sockfd, SOL_SOCKET, SO_ERROR, (char*)&error, &len);
                        if(error != 0)
                        {
                            break;
                        }
                    }
                    else
                    { //timeout or select error
                        break;
                    }
                }
                else
                {
                    printf("connect() error=%d\n", WSAGetLastError());
                    break;
                }
            }

opt = 0;
            //set blocking
            if (ioctlsocket(sockfd, FIONBIO, &opt) < 0)
            {
                printf("ioctlsocket(FIONBIO, %d) error=%d", opt, WSAGetLastError());
                break;
            }

int iTimeOut = nTimeOut;
            setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (char*)&iTimeOut, sizeof(iTimeOut));        
            setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, (char*)&iTimeOut, sizeof(iTimeOut));

return sockfd;
        }
        while (FALSE);
        
        closesocket(sockfd);
        return NULL;
    }

用于connect超时控制。

还有不完善的地方。

高手路过,请不吝赐教。

windows下设置socket的connect超时的更多相关文章

  1. [转]windows下设置socket的connect超时

    原文地址:http://www.cnblogs.com/BloodAndBone/archive/2012/05/22/2513338.html 变相的实现connect的超时,我要讲的就是这个方法, ...

  2. windows下的socket网络编程

    windows下的socket网络编程 windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了, ...

  3. windows下的socket网络编程(入门级)

    windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了,这次因为需要做一个跨平台的网络程序,就先 ...

  4. winsock教程- windows下的socket编程(c语言实现)

    winsock教程- windows下的socket编程(c语言实现) 使用winsock进行socket 编程     这是一个学习windows下socket编程(c语言)的快速指南.这是因为一下 ...

  5. 在Windows下设置环境变量 运行mysql程序变得更容易

    在Windows下设置环境变量,点开始菜单,右键单击我的电脑--属性--高级--环境变量 可以看到PATH的变量是这样的: C:\WINDOWS;C:\WINDOWS\COMMAND   为了让运行m ...

  6. windows下设置JupyterNotebook默认目录

    目录 windows下设置JupyterNotebook默认目录 生成配置文件 设置默认工作目录 设置快捷方式中的目标与起始位置 直接修改anaconda中的相关配置文件 windows下设置Jupy ...

  7. 一个简单的Windows下的socket程序

    服务器端代码server.cpp: #include <stdio.h> #include <WinSock2.h> #pragma comment(lib,"ws2 ...

  8. Linux下TCP网络编程与基于Windows下C#socket编程间通信

    一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使s ...

  9. Linux和windows下内核socket优化项 (转)

    问题: No buffer space available Linux: vi /etc/sysctl.conf net.core.netdev_max_backlog = 30000  每个网络接口 ...

随机推荐

  1. 转: 视频相关的协议族介绍(rtsp, hls, rtmp)

    转自: http://www.zhihu.com/question/20621558   作者:杨华链接:http://www.zhihu.com/question/20621558/answer/1 ...

  2. JavaScript:exec()方法的用法及说明

    最近在看某知名js框架的源码,突然间发现自己对exec()方法竟然不太理解,然后就仔细的分析了一下这个方法 下面贴个exec()方法使用的代码出来 rquickExpr = /^(?:\s*(< ...

  3. Struts2_使用 Filter 作为控制器的 MVC 应用

  4. js对象,原型,call,apply浅析

    //对象直接量,创建对象最简单的方式是在js里使用对象直接量 var book = { "main title": "js", //属性里有空格,要用引号 &q ...

  5. [老老实实学WCF] 第三篇 在IIS中寄存服务

    老老实实学WCF 第三篇 在IIS中寄宿服务 通过前两篇的学习,我们了解了如何搭建一个最简单的WCF通信模型,包括定义和实现服务协定.配置服务.寄宿服务.通过添加服务引用的方式配置客户端并访问服务.我 ...

  6. jenkins(一)集成环境搭建示例

    一.环境准备 1.安装java环境 测试自己机器是否已安装,在dos上运行java-version ,出现如下类似结果表示安装完成 2.安装Git/svn git具体配置见我的博客 “GitHub使用 ...

  7. cocos2dx注册场景 使用CCEditBox实现输入框

    我们在开始玩一个游戏时,通常要做的第一件事就是注册账号,下面就让我们来制作一个简单的注册场景,我所使用的cocos2dx版本为2.2.2 在这个场景中最主要的元素就是输入框和按钮,我从网上找了一些素材 ...

  8. Row_Number实现分页(适用SQL)

    1:首先是 select ROW_NUMBER() over(order by id asc) as 'rowNumber', * from table1 生成带序号的集合 2:再查询该集合的 第 1 ...

  9. 延迟加载(Lazy Load)

    一个对象,它虽然不包含所需要的所有数据,但是它知道怎么获取这些数据 设计专门的对象来把数据从DB中加载到内存中. 该对象可以完成在加载所需对象的同时,把与之相关的对象也一并加载了. 否则,必须显示加载 ...

  10. flume+kafka (分区实现 默认单分区) (二)

    这篇文章主要在上一篇文章的基础上讲一下 如何自定义flume到kafka的分区 上一节中从下面的地址下载了一个源码 https://github.com/beyondj2ee/flumeng-kafk ...