[Linux]关于非阻塞socket调用connect

今天调试一段很老的代码,程序以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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值