#include #include #include #include #include #include #include #include #include #define BUFSIZE 256 /* バッファサイズ */ #define ERR -1 /* システムコールのエラー */ #define SERVER_PORT 8001 /* サーバのソケットポート番号 */ #define REVERSE "\033[7m" /* 反転表示 ESC [ 7m */ #define NORMAL "\033[m" /* ノーマル表示 ESC [ m */ int main() { int sockfd; /* socket()の返すファイル記述子 */ int ns; /* accept()の返すファイル記述子 */ struct sockaddr_in server; /* サーバープロセスのソケットアドレス情報 */ struct sockaddr_in client; /* クライアントプロセスのソケットアドレス情報 */ int fromlen; /* クライアントプロセスのソケットアドレスの長さ */ 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); /* ソケットのポート番号を設定 */ server.sin_addr.s_addr = htonl(INADDR_ANY); /* IPアドレスの設定 */ /* ソケットへの名前づけ */ if( bind(sockfd, (struct sockaddr*)&server, sizeof(server)) == ERR ) exit(1); /* 接続要求の受け入れ準備 */ if( listen(sockfd, 5) == ERR ) exit(1); fromlen = sizeof(client); /* 接続要求の許可 */ ns = accept(sockfd, (struct sockaddr*)&client, &fromlen); if( ns == ERR ) exit(1); /* クライアントプロセスのソケットアドレス情報の確認 */ printf("\nconnect request from: %s port: %d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port)); while(1) { FD_ZERO(&fdmask); /* 読み出し用ファイル記述子集合の初期化 */ FD_SET(0, &fdmask); /* ファイル記述子0を集合へ設定 */ FD_SET(ns, &fdmask);/* ファイル記述子 ns を集合へ設定 */ fdwidth = ns + 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(ns, buf, n) == ERR ) exit(1); } else if( n == 0 ) /* キーボードからの入力終了 */ { printf("Terminated.\n"); break; } else { exit(1); } } /* ファイル記述子 ns が入力可能かどうかをチェック */ if( FD_ISSET(ns, &fdmask) ) { /* ファイル記述子 ns が入力可能かどうかをチェック */ n = read(ns, 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(1); } else if( n == 0 ) /* クライアントからの受信終了 */ { printf("クライアントとのコネクションを切断\n"); break; } else { exit(1); } } } close(ns); /* accept()で返されたファイル記述子のクローズ */ close(sockfd); /* ソケットのクローズ */ return 0; }