connect 非阻塞 超时机制 转
来源:互联网 发布:运营商网络转型 编辑:程序博客网 时间:2024/05/29 18:57
阻塞套接字的一般情况下,connect ()直到客户端对SYN消息的ACK消息到达之前才会返回。使connect()调用具有超时机制的一个方法是让套接字成为非阻塞的套接字体,然后用select()来等待它完成。
[code:1:7901c37cf2]
s = socket(AF_INET, SOCK_STREAM, 0);
//下面获取套接字的标志
if ((flags = fcntl(s, F_GETFL, 0)) < 0) {
//错误处理
}
//下面设置套接字为非阻塞
if (fcntl(s, F_SETFL, flags | O_NONBLOCK) < 0) {
//错误处理
}
if ((retcode = connect(s, (struct sockaddr*)&peer, sizeof(peer)) &&
errno != EINPROGRESS) {
//因为套接字设为NONBLOCK,通常情况下,连接在connect()返回
//之前是不会建立的,因此它会返回EINPROGRESS错误,如果返回
//任何其他错误,则要进行错误处理
}
if (0 == retcode) { //如果connect()返回0则连接已建立
//下面恢复套接字阻塞状态
if (fcntl(s, F_SETFL, flags) < 0) {
//错误处理
}
//下面是连接成功后要执行的代码
exit(0)
}
FD_ZERO(&rdevents);
FD_SET(s, &rdevents); //把先前的套接字加到读集合里面
wrevents = rdevents; //写集合
exevents = rdevents; //异常集合
tv.tv_sec = 5; //设置时间为5秒
tv_tv_usec = 0;
retcode = select(s+1, &rdevents, &wrevents, &exevents, &tv);
if (retcode < 0) { //select返回错误???
//错误处理
}
else if (0 == retcode) { //select 超时???
//超时处理
}
esle {
//套接字已经准备好
if (!FD_ISSET(s, &rdevents) && !FD_ISSET(s, &wrevents)) {
//connect()失败,进行错处理
}
if (getsockopt(s, SOL_SOCKET, SO_ERROR, &err, &len) < 0) {
//getsockopt()失败,进行错处理
}
if (err != 0) {
//connect()失败,进行错处理
}
//到这里说明connect()正确返回
//下面恢复套接字阻塞状态
if (fcntl(s, F_SETFL, flags) < 0) {
//错误处理
}
//下面是连接成功后要执行的代码
exit(0)
}
[code:1:7901c37cf2]
s = socket(AF_INET, SOCK_STREAM, 0);
//下面获取套接字的标志
if ((flags = fcntl(s, F_GETFL, 0)) < 0) {
//错误处理
}
//下面设置套接字为非阻塞
if (fcntl(s, F_SETFL, flags | O_NONBLOCK) < 0) {
//错误处理
}
if ((retcode = connect(s, (struct sockaddr*)&peer, sizeof(peer)) &&
errno != EINPROGRESS) {
//因为套接字设为NONBLOCK,通常情况下,连接在connect()返回
//之前是不会建立的,因此它会返回EINPROGRESS错误,如果返回
//任何其他错误,则要进行错误处理
}
if (0 == retcode) { //如果connect()返回0则连接已建立
//下面恢复套接字阻塞状态
if (fcntl(s, F_SETFL, flags) < 0) {
//错误处理
}
//下面是连接成功后要执行的代码
exit(0)
}
FD_ZERO(&rdevents);
FD_SET(s, &rdevents); //把先前的套接字加到读集合里面
wrevents = rdevents; //写集合
exevents = rdevents; //异常集合
tv.tv_sec = 5; //设置时间为5秒
tv_tv_usec = 0;
retcode = select(s+1, &rdevents, &wrevents, &exevents, &tv);
if (retcode < 0) { //select返回错误???
//错误处理
}
else if (0 == retcode) { //select 超时???
//超时处理
}
esle {
//套接字已经准备好
if (!FD_ISSET(s, &rdevents) && !FD_ISSET(s, &wrevents)) {
//connect()失败,进行错处理
}
if (getsockopt(s, SOL_SOCKET, SO_ERROR, &err, &len) < 0) {
//getsockopt()失败,进行错处理
}
if (err != 0) {
//connect()失败,进行错处理
}
//到这里说明connect()正确返回
//下面恢复套接字阻塞状态
if (fcntl(s, F_SETFL, flags) < 0) {
//错误处理
}
//下面是连接成功后要执行的代码
exit(0)
}
- connect 非阻塞 超时机制 转
- connect超时设置.阻塞和非阻塞 ioctlsocket函数
- 使用非阻塞socket来控制connect的超时
- Windows上如何玩非阻塞的connect?---让程序员自定义connect函数的超时时间
- 非阻塞connect
- 非阻塞connect编程
- linux非阻塞connect
- 非阻塞CONNECT
- 创建非阻塞connect
- 非阻塞connect()
- 非阻塞connect
- 非阻塞connect学习
- 非阻塞connect
- 非阻塞connect
- 非阻塞connect流程
- 非阻塞connect
- 非阻塞connect()
- 非阻塞connect问题
- C++ ofstream和ifstream详细用法
- 中介者模式(Mediator)
- H264 residual data syntax overview
- hdu 1271 整数对(数学,3级)
- 6.15奇特大数加法
- connect 非阻塞 超时机制 转
- 浅谈百度站长工具“消息提醒”和“外链分析”
- asp验证码代码 (带刷新)
- 扩展方法/对象与集合初始化器
- 求两个DNA的距离-最短编辑距离变形
- Linux中的内存屏障
- cocos2d-x windows 7 Android开发环境搭建
- .net 常用命名空间
- linux块设备驱动