ブロックなしソケット接続処理


ブロック以外のソケットでは、connectはすぐに完了できないとエラーに戻ります。通常はシステムが提供するerrno変数の中でEnRPOCESSエラーを返します。この時TCPの3つの握手は続けます。connnectの接続が成功したかどうかをどう判断しますか?ネットワークから多くの関連記事を調べましたが、linuxシステムではこの問題に対して良い処理方法を提供していません。多くの方法はプログラム論理によって判断されます。ロジックプロセスは以下の通りです。1.socketを作成します。このsocketを非ブロックモードに設定します。3.connectを呼び出します。4.selectを使ってこのsocket記述子が書くかどうかをチェックします。5.selectによって。戻る結果判断connect()結果
#include <sys/socket.h>
#include <sys/types.h>
#define TIME_OUT_TIME 30
int main(int argc , char **argv)
{
	int sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if(sockfd < 0) 
		exit(1);

	struct sockaddr_in serv_addr;
	int error = -1;
	int len = sizeof(int);
	timeval tm;
	fd_set set;
	unsigned long ul = 1;

	//        
	ioctl(sockfd, FIONBIO, &ul);
	bool ret = false;
	if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1)
	{
		tm.tv_set  = TIME_OUT_TIME;
		tm.tv_uset = 0;
		FD_ZERO(&set);
		FD_SET(sockfd, &set);
		//        ,         NULL,        30
		if(select(sockfd+1, NULL, &set, NULL, &tm) > 0)
		{
			//      getsockopt                           
			getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, (socklen_t *)&len);
			if(error == 0) {
				ret = true;
			} else { 
				ret = false;
			}
		} else { 
			ret = false;
		}
	} else {
		ret = true;
	}
	
	if(!ret) 
	{
		close( sockfd );
		fprintf(stderr , "Cannot Connect the server!/n");
		return;
	}
	
	fprintf( stderr , "Connected!/n");
}