windows下设置socket的connect超时
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超时的更多相关文章
- [转]windows下设置socket的connect超时
原文地址:http://www.cnblogs.com/BloodAndBone/archive/2012/05/22/2513338.html 变相的实现connect的超时,我要讲的就是这个方法, ...
- windows下的socket网络编程
windows下的socket网络编程 windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了, ...
- windows下的socket网络编程(入门级)
windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了,这次因为需要做一个跨平台的网络程序,就先 ...
- winsock教程- windows下的socket编程(c语言实现)
winsock教程- windows下的socket编程(c语言实现) 使用winsock进行socket 编程 这是一个学习windows下socket编程(c语言)的快速指南.这是因为一下 ...
- 在Windows下设置环境变量 运行mysql程序变得更容易
在Windows下设置环境变量,点开始菜单,右键单击我的电脑--属性--高级--环境变量 可以看到PATH的变量是这样的: C:\WINDOWS;C:\WINDOWS\COMMAND 为了让运行m ...
- windows下设置JupyterNotebook默认目录
目录 windows下设置JupyterNotebook默认目录 生成配置文件 设置默认工作目录 设置快捷方式中的目标与起始位置 直接修改anaconda中的相关配置文件 windows下设置Jupy ...
- 一个简单的Windows下的socket程序
服务器端代码server.cpp: #include <stdio.h> #include <WinSock2.h> #pragma comment(lib,"ws2 ...
- Linux下TCP网络编程与基于Windows下C#socket编程间通信
一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使s ...
- Linux和windows下内核socket优化项 (转)
问题: No buffer space available Linux: vi /etc/sysctl.conf net.core.netdev_max_backlog = 30000 每个网络接口 ...
随机推荐
- dfa最小化,上一个版本采用的是moore的打表法,这个版本采用的是hopcroft的方法,但是实现中采用链表而不是栈来优化。
hopcroft法的复杂度,他们说是nlogn,可是都没有严格的证明.难得找到一篇讲的详细点的论文,却又啰里啰唆的,不过那篇论文里面采用的是颜色树这个结构,有点意思. 前面的那个算法是n的平方复杂度, ...
- SVN管理规范
命名规范 tags 正式版 REL-X.X.X branches 发版前 RB-X.X.X 新功能 TRY-XXX 修BUG BUG-XXXX trunk 开发 使用注意事项 负责而谨慎地提交自己的代 ...
- xcode报错 has been modified since the precompiled header was built
删除/Users/username/Library/Developer/Xcode/DerivedData/ModuleCache 下的所有文件
- [wordpress] 输出一个过滤器绑定的方法
参考了WordPress: How do I get all the registered functions for 'the_content' filter, function print_fil ...
- 百度地图LBS开放平台AK一直没有用
http://api.map.baidu.com/geoconv/v1/?coords=114.21892734521,29.575429778924;114.21892734521,29.57542 ...
- CSS制作一个简单网页的下拉导航栏
网页下拉导航栏的制作 网页下拉导航栏的制作很简单,只需要运用好CSS中伪选择器. 首先说明几个简单的伪选择器(比较常用的): link:连接平常的状态 visited:连接被访问过之后 hover:鼠 ...
- Table of Contents - JMS
JMS Specification v1.1 JMS 基本概念 Message QueueBrowser 消息选择器 消息确认 ConnectionMetaData ExceptionListener ...
- arcsde service(esri_sde)服务启动后又停止
由于最近几天我们公司换了新办公楼,各种服务器得重新配置.当我试图直接将arcsde Service的服务器IP改为现在的地址,就报上面如题的错误. SQL服务器是好的,不用管它,只要确保它是开启的.只 ...
- C#如何关闭一个窗口的同时打开另一个窗口
在.net的WinForm程序中,如果是直接起动的Form作为主窗口,那么这个主窗口是不能关闭的,因为它维护了一个Windows消息循环,它一旦关闭了就等于声明整个应用程序结束,所以新打开的窗口也就被 ...
- php 检查email电子邮件函数(奇葩写法)
以前写的一个PHP表单电子邮件发送程序,其中采用如下方法来验证电子邮件地址格式是否正确: 代码如下 复制代码 eregi("^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0 ...