ブロックなしでconnectにENPROGRESSエラーが発生しました.
1929 ワード
//原文の住所:http://blog.csdn.net/saspss/article/details/8487678
、、、
今日、コミッションsocketで、ブロックモードでないと、サーバーを接続する時connectはいつも-1に返答しています.後に、ある先輩のコードを見て、考え方は次の文章と同じぐらい意味があります.
つまり、ブロックモードではない接続サーバは、返却値がENPROGRESSかどうかを判定するために、このsocketがいいはずです.
文章を転載して、問題があった子供靴の参考にしてください.
、、、
今日はゲームクライアントのテストプログラムを開発する時、多くのクライアントが現れて、connectを通じて成功した後、コードカードはrecvシステムで呼び出されました.その後、socketがデフォルトでブロックされているため、多くのクライアントを許可します.
リンクがリンクされていますが、データの状態は伝送できません.
その後、socketを非閉塞モードに修正しましたが、connectの時に、戻り値が-1であることが分かりました.最初はconnectに間違いがあったと思いましたが、サーバー上でリンクがESTABLISED状態であることが分かりました.リンクが成功したことを証明します.
ところで、なぜリターン値は-1ですか?調べた資料や、steventを見ているAPUEを見ても、このように言われています.
connectが閉塞モードでないと-1値に戻ります.エラーコードはENPROGRESSですが、connectが接続されているとどう判断しますか?stevent本では、connect後にそのsocketが書くかどうかを判断し続けると説明しています.
書くことができれば、リンクが成功したことを証明します.書くべきかどうかを判断するには、2つの案があります.一つは、書くべきかどうかを判断するためのselectで、もう一つはpollモデルを使うことです.
select:
int CheckConnect(intiSocket){fduset rset];FD(&rset);FD(iSocket);timeval tm;tvvaec=0;tm.tv.tvuusec=0;ift(select(iSocket+1,Nrset=) close(iSocket) return-1;}if(FD(iSocket、&rset){ int err=-1 socklenuut len=sizof(int);if(get sockopt(iSocket) SOL SOCKET、ソルERROR、&err、&len)<0){ close(iSocket) printf(「errno:%d%s」、errno、sterror); return-2;}if(err){ errno=err; close(iSocket) return-3;}return 0;
poll:
、、、
今日、コミッションsocketで、ブロックモードでないと、サーバーを接続する時connectはいつも-1に返答しています.後に、ある先輩のコードを見て、考え方は次の文章と同じぐらい意味があります.
つまり、ブロックモードではない接続サーバは、返却値がENPROGRESSかどうかを判定するために、このsocketがいいはずです.
文章を転載して、問題があった子供靴の参考にしてください.
、、、
今日はゲームクライアントのテストプログラムを開発する時、多くのクライアントが現れて、connectを通じて成功した後、コードカードはrecvシステムで呼び出されました.その後、socketがデフォルトでブロックされているため、多くのクライアントを許可します.
リンクがリンクされていますが、データの状態は伝送できません.
その後、socketを非閉塞モードに修正しましたが、connectの時に、戻り値が-1であることが分かりました.最初はconnectに間違いがあったと思いましたが、サーバー上でリンクがESTABLISED状態であることが分かりました.リンクが成功したことを証明します.
ところで、なぜリターン値は-1ですか?調べた資料や、steventを見ているAPUEを見ても、このように言われています.
connectが閉塞モードでないと-1値に戻ります.エラーコードはENPROGRESSですが、connectが接続されているとどう判断しますか?stevent本では、connect後にそのsocketが書くかどうかを判断し続けると説明しています.
書くことができれば、リンクが成功したことを証明します.書くべきかどうかを判断するには、2つの案があります.一つは、書くべきかどうかを判断するためのselectで、もう一つはpollモデルを使うことです.
select:
int CheckConnect(intiSocket){fduset rset];FD(&rset);FD(iSocket);timeval tm;tvvaec=0;tm.tv.tvuusec=0;ift(select(iSocket+1,Nrset=) close(iSocket) return-1;}if(FD(iSocket、&rset){ int err=-1 socklenuut len=sizof(int);if(get sockopt(iSocket) SOL SOCKET、ソルERROR、&err、&len)<0){ close(iSocket) printf(「errno:%d%s」、errno、sterror); 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: %s
",
iSocket, strerror (ret));
return -1;
}
return 0;
}