#include #include #include #include #include #include #include #include #include #include #define BUFSIZE 256 /* バッファサイズ */ #define ERR -1 /* システムコールのエラー */ #define SERVER_ADDR "localhost" /* サーバのアドレス */ #define SERVER_PORT 8001 /* サーバのポート番号 */ #define REVERSE "\033[7m" /* 反転表示 ESC 7 m */ #define NORMAL "\033[m" /* ノーマル表示 ESC m */ int main() { int sockfd; /* socket()の返すファイル記述子 */ struct sockaddr_in server; /* サーバープロセスのソケットアドレス情報 */ struct hostent *hp; /* ホスト情報 */ fd_set fdmask; /* 読み出し用ファイル記述子の集合 */ int fdwidth; /* チェックするファイル記述子の最大個数 */ char buf[BUFSIZE]; /* 入力データを格納するバッファ */ int n; /* 読み出しバイト数 */ /* ソケットの作成 */ sockfd = socket(PF_INET, SOCK_STREAM, 0); if( sockfd == ERR ) exit(1); /* サーバープロセスのソケットアドレス情報の設定 */ memset((char*)&server, 0, sizeof(server)); /* アドレス情報構造体の初期化 */ server.sin_family = PF_INET; /* プロトコルファミリの設定 */ server.sin_port = htons(SERVER_PORT); /* ソケットのポート番号の設定 */ /* ホスト情報の取得 */ hp = gethostbyname(SERVER_ADDR); if( hp == NULL ) exit(1); /* IPアドレスの設定 */ memcpy((char*)&server.sin_addr, hp->h_addr, hp->h_length); /* 接続要求の発信 */ if( connect(sockfd, (struct sockaddr*)&server, sizeof(server)) == ERR ) exit(1); while(1) { FD_ZERO(&fdmask); /* 読み出し用ファイル記述子集合の初期化 */ FD_SET(0, &fdmask); /* ファイル記述子0を集合へ設定 */ FD_SET(sockfd, &fdmask); /* ファイル記述子 sockfd を集合へ設定 */ fdwidth = sockfd + 1; /* チェックするファイル記述子の最大個数の設定 */ /* ファイル記述子の監視 */ if( select(fdwidth, (fd_set*)&fdmask, NULL, NULL, NULL) == ERR ) exit(1); /* ファイル記述子0が入力可能かどうかチェック */ if( FD_ISSET(0, &fdmask) ) { n = read(0, buf, BUFSIZE); if( n > 0 ) { if( write(sockfd, buf, n) == ERR ) exit(1); } else if( n == 0 ) { printf("Terminated.\n"); break; } else { exit(1); } } /* ファイル記述子sockfdが入力可能かどうかをチェック */ if( FD_ISSET(sockfd, &fdmask) ) { n = read(sockfd, buf, BUFSIZE); if( n > 0 ) { if( write(1, REVERSE, strlen(REVERSE)) == ERR ) exit(1); if( write(1, buf, n ) == ERR ) exit(1); if( write(1, NORMAL, strlen(NORMAL)) == ERR ) exit; } else if( n == 0 ) { printf("サーバーからの接続を解除しました\n"); break; } else { exit(1); } } } close(sockfd); return 0; }