ブロックなしソケット接続処理
ブロック以外のソケットでは、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");
}