非阻塞情况下connect产生EINPROGRESS错误
来源:互联网 发布:软件界面设计教程 编辑:程序博客网 时间:2024/06/06 01:53
今天在开发游戏客户端测试程序时,由于出现很多客户端,经过connect成功后,代码卡在recv系统调用中,后来发现可能是由于socket默认是阻塞模式,所以会令很多客户端
链接处于链接却不能传输数据状态。
后来修改socket为非阻塞模式,但在connect的时候,发现返回值为-1,刚开始以为是connect出现错误,但在服务器上看到了链接是ESTABLISED状态。证明链接是成功的
但为什么会出现返回值是-1呢? 经过查询资料,以及看stevens的APUE,也发现有这么一说。
当connect在非阻塞模式下,会出现返回-1值,错误码是EINPROGRESS,但如何判断connect是联通的呢?stevens书中说明要在connect后,继续判断该socket是否可写?
若可写,则证明链接成功。如何判断可写,有2种方案,一种是select判断是否可写,二用poll模型。
select:
int CheckConnect(int iSocket){fd_set rset;FD_ZERO(&rset);FD_SET(iSocket, &rset);timeval tm;tm. tv_sec = 0;tm.tv_usec = 0;if ( select(iSocket + 1, NULL, &rset, NULL, &tval) <= 0){ close(iSocket); return -1;}if (FD_ISSET(iSocket, &rset)){ int err = -1; socklen_t len = sizeof(int);if ( getsockopt(iSocket, SOL_SOCKET, SO_ERROR ,&err, &len) < 0 ){ close(iSocket); printf("errno:%d %s\n", errno, strerror(errno)); return -2;}if (err){ errno = err; close(iSocket); return -3;}return 0;}
poll:
int CheckConnect(int iSocket) {struct pollfd fd;int ret = 0;socklen_t len = 0;fd.fd = iSocket;fd.events = POLLOUT;while ( poll (&fd, 1, -1) == -1 ) {if( errno != EINTR ){perror("poll");return -1;}}len = sizeof(ret);if ( getsockopt (iSocket, SOL_SOCKET, SO_ERROR, &ret, &len) == -1 ) { perror("getsockopt");return -1;}if(ret != 0) {fprintf (stderr, "socket %d connect failed: %s\n", iSocket, strerror (ret));return -1;}return 0;}
0 0
- 非阻塞情况下connect产生EINPROGRESS错误
- 非阻塞情况下connect产生EINPROGRESS错误
- 非阻塞情况下connect产生EINPROGRESS错误
- 非阻塞情况下connect产生EINPROGRESS错误
- 非阻塞情况下connect产生EINPROGRESS错误
- Linux 非阻塞connect,错误码:EINPROGRESS
- 非阻塞connect,错误码:EINPROGRESS
- Linux 非阻塞connect,错误码:EINPROGRESS
- 非阻塞connect,错误码:EINPROGRESS
- 非阻塞connect errno为EINPROGRESS,如何判断已经连接上了?
- Linux下非阻塞connect
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值. +accept,connect
- linux下socket connect非阻塞与阻塞
- recv和recv from ,send和sendto 在阻塞和非阻塞的情况下的错误码
- 非阻塞connect
- 非阻塞connect编程
- linux非阻塞connect
- 非阻塞CONNECT
- 经典算法问题的java实现<二>
- 朴素贝叶斯分类及程序简述笔记
- IE中tr之间有空白行,而在Firefox中没有空白
- maven中央仓库大集合
- SRLTE,SGLTE,SVLTE,CSFB,VoLTE的区别
- 非阻塞情况下connect产生EINPROGRESS错误
- 全新安装Mac OSX 开发者环境 同时使用homebrew搭建 PHP,Nginx ,MySQL,Redis,Memcache ... ... (LNMP开发环境)
- 【Kruscal】城市建设
- linux命令大全
- leetcode 日经贴,python code -Unique Paths
- zoj 2048 && poj 1751 Highways
- 多线程学习笔记(二)
- 例题9-15 校长的烦恼 UVa10817
- 【算法学习笔记】20.算法设计初步 归并排序 求逆序数