socket 非阻塞模式下的connect封装实现
来源:互联网 发布:高性能网络编程 二 编辑:程序博客网 时间:2024/06/05 21:11
connect 在非阻塞模式下,返回值 为0的时候表示 已建立连接;返回值为-1,且此时错误值是 EINPROGRESS时,,表示连接进行的3次握手正在进行。需要后续通过select或者是epoll来判断,如果select返回值为1,此时任然需要判断 socket是否有错。通过getsockopt来获取socket的错误值。
flags = fcntl(sockfd, F_GETFL, 0); fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); if ((retVal = connect(sockfd, saptr, salen)) < 0) if (errno != EINPROGRESS) return (-1); if (retVal == 0) { // restore file status flags fcntl(sockfd, F_SETFL, flags); return 0; } FD_ZERO(&rset); FD_SET(sockfd, &rset); wset = rset; tval.tv_sec = nsec; tval.tv_usec = 0; if ((retVal = select(sockfd + 1, &rset, &wset, NULL, &tval)) == 0) { // timeout close(sockfd); errno = ETIMEDOUT; return (-1); } if (retVal < 0) { // select() failed return (-1); } if (FD_ISSET(sockfd, &rset) || FD_ISSET(sockfd, &wset)) { len = sizeof(error); error = 0; if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) return (-1); if (error > 0) //<<<<< error == EINPROGRESS >>> { close(sockfd); errno = error; return (-1); } } else { return (-1); } // restore file status flags fcntl(sockfd, F_SETFL, flags);
0 0
- socket 非阻塞模式下的connect封装实现
- 非阻塞模式的设置、设置socket为非阻塞模式 解决connect阻塞问题
- socket非阻塞的connect
- connect实现非阻塞模式
- 一个关于socket在非阻塞模式下connect是否成功的例子
- socket非阻塞connect
- 非阻塞socket-connect
- 非阻塞connect的实现
- 非阻塞connect的实现
- 非阻塞connect的实现
- 非阻塞connect的实现
- 非阻塞connect的实现
- 非阻塞connect的实现
- 非阻塞connect的实现
- 非阻塞 connect 的实现
- 非阻塞模式下connect的使用方式
- linux-socket connect阻塞和非阻塞模式 示例
- connect的内核实现/非阻塞connect
- Visual C# 字体对话框 & 颜色对话框
- Linked List Cycle
- 新浪&腾讯微博:MySQL数据库主表设计猜想
- spring学习笔记(6)--自动装配autowire
- 逆波兰表达式运算
- socket 非阻塞模式下的connect封装实现
- CSDN编程挑战之彩色石子(使用暴力破解法)
- Java排序算法优化--插入排序【温故而知新】
- 线程安全之Collections.synchronizedList
- android开发笔记之也谈android开发入门
- Myeclipse10下java.lang.OutOfMemoryError: Java heap space的解决办法
- 初窥UIKit Dynamics
- mina serial 串口
- 友元函数(相当于C#的属性)