Linux下socket非阻塞的一些技巧

在Linux下,connect()建立连接,-1为失败,但是-1不一定就是完全失败!

-1的情况下,有的是因为非阻塞造成的,就是在error中设置了对应的出错情况,例如EINPROGRESS,EAGAIN等可以认为是“非致命错误”,认为是可以接受的,这种只是导致暂时阻塞等情况。

所以可以如下使用

int ret = connect(...);

if(!ret || noFatalError())
{
  //认为是成功的
}

bool nonFatalError()
{
   int err = errorno();
   return (err == EINPROGRESS || err == EAGAIN || err == EWOULDBLOCK || err == EINTR);
}

类似的技巧还可以用于区分read、write时,是真失败还是阻塞的时候

Leave a Reply

Your email address will not be published. Required fields are marked *