ブロックなしで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:
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; }