您的位置:首页>互联网 >内容

linux(非阻塞connect errno什么情况下不为einprogress)

2022-07-15 21:48:37来源:
导读 想必现在有很多小伙伴对于linux 非阻塞connect errno什么情况下不为einprogress方面的知识都比较想要了解,那么今天小好小编就为大家收

想必现在有很多小伙伴对于linux 非阻塞connect errno什么情况下不为einprogress方面的知识都比较想要了解,那么今天小好小编就为大家收集了一些关于linux 非阻塞connect errno什么情况下不为einprogress方面的知识分享给大家,希望大家会喜欢哦。

当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 %sn", 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: %sn",

iSocket, strerror (ret));

return -1;

}

return 0;

}

本文到此结束,希望对大家有所帮助。

免责声明:本文由用户上传,如有侵权请联系删除!

猜你喜欢

最新文章