今天调试一段很老的代码,程序以Nonblocking方式创建了socket,但是在调用connect之前,使用ioctl将socket设置为阻塞,等connect成功后再设置为非阻塞。
调试后发现,connect始终返回-1,errno=115(EINPROGRESS)。
在网上查了一下,对于非阻塞socket,调用connect时,如果返回EINPROGRESS,则说明操作正在进行,并不代表connect出错。
接下来,就怀疑ioctrl头上了。但单步调试发现,该函数返回0,即成功!
在网上继续查了一下,看到了这个帖子:
http://blog.csdn.net/wwwsq/article/details/970198
ioctrl的使用确实很具迷惑性,在这里ioctrl虽然返回成功,但并没有生效。
正确的调用,应该使用fcntl。
错误的做法:
u_long has = 1;
ioctl(m_sock, FIONBIO , &has);
正确的做法:
int flags = fcntl(m_sock, F_GETFL, 0);
fcntl(m_sock, F_SETFL, flags|O_NONBLOCK);