由select/epoll返回的非阻塞connect还会是EINPROGRESS状态吗?
一般情况下,我们像下面代码中所示的这样使用非阻塞connect:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <fcntl.h>
#include <arpa/inet.h>
#include <sys/epoll.h>
#include <errno.h> #define EPOLL_MAXEVENTS 64 int main(int argc, char *argv[])
{
int fd, epfd, flags, status, ret, nevents, i, slen;
struct sockaddr_in addr;
struct in_addr remote_ip;
struct epoll_event ev, events[EPOLL_MAXEVENTS];; if ((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ) {
perror("socket failed");
return -1;
} status = 1;
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &status, sizeof(int))) {
perror("setsockopt failed");
return -1;
} flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK); memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = 9999;
if (inet_pton(AF_INET, "10.232.129.43", &addr.sin_addr) <= 0) {
perror("inet_pton error");
return -1;
} ret = connect(fd, (struct sockaddr *) &addr, sizeof(struct sockaddr));
if (ret == 0) {
printf("non-blocking connect success. connect complete immediately");
close(fd);
return -1;
} if (ret < 0 && errno != EINPROGRESS) {
perror("connect error!");
return -1;
} epfd = epoll_create(EPOLL_MAXEVENTS);
ev.events = EPOLLOUT;
ev.data.fd = fd;
if (epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &ev) == -1 ) {
perror("epoll_ctl error");
goto finish;
}
printf("add connect fd into epoll"); memset(events, 0, sizeof(events)); for (;;) { nevents = epoll_wait(epfd, events, EPOLL_MAXEVENTS, -1); if (nevents < 0) {
perror("epoll_wait failed");
goto finish;
} for (i = 0; i < nevents; i++) { if (events[i].data.fd == fd) { if (getsockopt(fd, SOL_SOCKET, SO_ERROR, (void *) &status, &slen)
< 0)
{
perror("getsockopt error!");
goto finish;
}
if (status != 0) {
perror("connect error!");
goto finish;
} printf("non-blocking connect success!"); if (epoll_ctl(epfd, EPOLL_CTL_DEL, fd, NULL) == -1 ) {
perror("epoll_ctl error");
return 0;
} /* DO write... */
}
}
} finish:
close(fd);
close(epfd); return 0;
}
在上面的代码中需要注意几点:
1,什么时候connect返回成功?
三次握手中的client如果收到server对SYN的ACK,connect就会返回。
2,非阻塞的connect成功返回后,用getsockopt获得的SO_ERROR码还会使EINPROGRESS吗?
不会。除非是epoll设置的超时时间到达,否则epoll_wait返回fd后,表明fd已经可写,connect已经建立成功。此时如果getsockopt获取到的SO_ERROR 状态码是status表明connect已失败,不可能再是EINPROGRESS。
由select/epoll返回的非阻塞connect还会是EINPROGRESS状态吗?的更多相关文章
- (转)非阻塞Connect对于select时应注意问题
对于面向连接的socket类型(SOCK_STREAM,SOCK_SEQPACKET)在读写数据之前必须建立连接,首先服务器端socket必须在一个客户端知道的地址进行监听,也就是创建socket之后 ...
- UNIX网络编程-非阻塞connect和非阻塞accept
1.非阻塞connect 在看了很多资料之后,我自己的理解是:在socket发起一次连接的时候,这个过程需要一段时间来将三次握手的过程走完,如果在网络状况不好或者是其他的一些情况下,这个过程需要比较长 ...
- linux 客户端 Socket 非阻塞connect编程
开发测试环境:虚拟机CentOS,windows网络调试助手 非阻塞模式有3种用途 1.三次握手同时做其他的处理.connect要花一个往返时间完成,从几毫秒的局域网到几百 ...
- TCP非阻塞accept和非阻塞connect
http://blog.chinaunix.net/uid-20751538-id-238260.html 非阻塞accept 当一个已完成的连接准备好被accept的时候,select会把监 ...
- 面向连接的socket数据处理过程以及非阻塞connect问题
对于面向连接的socket类型(SOCK_STREAM,SOCK_SEQPACKET)在读写数据之前必须建立连接,首先服务器端socket必须在一个客户端知道的地址进行监听,也就是创建socket之后 ...
- 非阻塞connect
步骤1: 设置非阻塞,启动连接 实现非阻塞 connect ,首先把 sockfd 设置成非阻塞的.这样调用 connect 可以立刻返回,根据返回值和 errno 处理三种情况: () 如果返回 , ...
- UNIX网络编程——非阻塞connect: Web客户程序
非阻塞的connect的实现例子出自Netscape的Web客户程序.客户先建立一个与某个Web服务器的HTTP连接,再获取一个主页.该主页往往含有多个对于其他网页的引用.客户可以使用非阻塞conne ...
- UNIX网络编程——非阻塞connect:时间获取客户程序
#include "unp.h" int connect_nonb(int sockfd, const SA *saptr, socklen_t salen, int nsec) ...
- UNIX网络编程——非阻塞connect
当在一个非阻塞的TCP套接字上调用connect时,connect将立即返回一个EINPROGRESS错误,不过已经发起的TCP三次握手继续进行.我们接着使用select检测这个连接或成功或失败的已建 ...
随机推荐
- 如何判断某版本的.NET Framework是否安装
1..NET Framework .NET Framework2.0 键:[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\N ...
- Linux 系统分析命令图
sar命令: 编辑 /etc/default/sysstat 设置为true sudo /etc/init.d/sysstat restart
- 第十四章 springboot + profile(不同环境读取不同配置)
具体做法: 不同环境的配置设置一个配置文件,例如:dev环境下的配置配置在application-dev.properties中:prod环境下的配置配置在application-prod.prope ...
- 第四章 四种List实现类的对比总结
1.ArrayList 非线程安全 基于对象数组 get(int index)不需要遍历数组,速度快: iterator()方法中调用了get(int index),所以速度也快 set(int in ...
- 如何在Windows 7 或Vista中修改MTU
Windows操作系统使用Maximum Transmission Unit (MTU) 来确定在下面的网络层上可以传输的协议数据包(protocol data packet)的最大尺寸. MTU参数 ...
- Web页面切图和CSS注意事项
一.Asp.net中的线程池设置 在Asp.net的服务处理中,每当服务器收到一个请求,HttpRuntime将从HttpApplication池中获取一个HttpApplication对象处理此请求 ...
- textarea光标移到末尾兼容ie,ffchrome
function moveEnd(obj){ obj.focus(); var len = obj.value.length; if (document ...
- 刀片服务器和磁盘阵列卡(RAID)技术---永和维护(转)
近期客户需要更换服务器,客户把买好的服务器送来了,原本感觉很小的一个服务器,可当我看到的时候是一个大个的又长又宽,类似机房服务器的那种,后来米老师给大致讲解一番:这个是刀片服务器. 刀片服务器是指在标 ...
- 使用Git下载Hadoop的到本地Eclipse开发环境
使用Git下载Hadoop的到本地Eclipse开发环境 博客分类: Hadoop *n*x MacBook Air hadoopgitmaveneclipsejava 问题场景 按照官网http: ...
- freemarker 模板开发入门
数据模型 scalars标量:从根 root 開始指定它的路径,每级之间用点来分隔. 如:whatnot.fruits sequences 序列:使用数组的方括号方式来訪问一个序列的子变量. 如:an ...