想必現(xiàn)在有很多小伙伴對(duì)于linux 非阻塞connect errno什么情況下不為einprogress方面的知識(shí)都比較想要了解,那么今天小好小編就為大家收集了一些關(guān)于linux 非阻塞connect errno什么情況下不為einprogress方面的知識(shí)分享給大家,希望大家會(huì)喜歡哦。
當(dāng)connect在非阻塞模式下,會(huì)出現(xiàn)返回-1值,錯(cuò)誤碼是EINPROGRESS,但如何判斷connect是聯(lián)通的呢?stevens書中說明要在connect后,繼續(xù)判斷該socket是否可寫?
若可寫,則證明鏈接成功。如何判斷可寫,有2種方案,一種是select判斷是否可寫,二用poll模型。
select:
芝士回答,版效權(quán)必持究,果未集經(jīng)等許可,不得轉(zhuǎn)載
int CheckConnect(int iSocket)
{
fd_set rset;
FD_ZERO(&rset);
FD_SET(iSocket, &rset);
timeval tm;
tm. tv_sec = 0;
國無想展品隊(duì)標(biāo)毛易派滿。
tm.tv_usec = 0;
if ( select(iSocket + 1, NULL, &rset, NULL, &tval) <= 0)
{
close(iSocket);
return -1;
}
由少角放金階受馬究驗(yàn),周族易價(jià)。
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;
}
本文到此結(jié)束,希望對(duì)大家有所幫助。