/************************************/ /*** client_sel.c ***/ /*** 入力: サーバからのメッセージ ***/ /*** 出力: サーバへの接続要求 ***/ /************************************/ #include #include #include #include #include int main() { int s; int addrlength; char read_buf[1024]; /****************************************/ /* 入力のファイル・ディスクリプタの集合 */ /****************************************/ fd_set rfds; /***********************************************************/ /* select() から返ってくるまでの時間の上限を設定する構造体 */ /***********************************************************/ /* struct timeval { */ /* long tv_sec; /* 秒 */ /* long tv_usec; /* マイクロ秒 */ /* }; */ /***********************************************************/ struct timeval tv; /***************************************************************/ /* ソケットアドレス UNIX */ /***************************************************************/ /* struct sockaddr_un { */ /* sa_family_t sun_family; /* AF_UNIX */ /* char sun_path[UNIX_PATH_MAX]; /* pathname */ /* }; */ /***************************************************************/ struct sockaddr_un addr; /****************************************/ /* ソケット、通信のための端点の作成 */ /* PF_UNIX: UNIX ローカル通信 */ /* SOCK_STREAM: 順序性と信頼性があり、 */ /* 双方向の、接続された */ /* バ イ ト・ ス ト リーム */ /****************************************/ s = socket(PF_UNIX, SOCK_STREAM, 0); if (s == -1) { printf("Can not create socket.\n"); exit(1); } /******************************/ /* アドレスの設定 */ /* AF_UNIX: UNIX ローカル通信 */ /* 名前: mysocket */ /******************************/ addr.sun_family = AF_UNIX; strcpy(addr.sun_path, "mysocket"); /**********************/ /* ソケットに接続する */ /**********************/ addrlength = sizeof(addr); if (connect(s, (struct sockaddr *)&addr, addrlength) == -1) { printf("Can not initiate a connection.\n"); exit(1); } printf("connected.\n"); while (1) { /******************************************************/ /* 入力のファイル・ディスクリプタの集合 rfds を clear */ /******************************************************/ FD_ZERO(&rfds); /**************************************/ /* 入力のディスクリプタの集合 rfds に */ /* 接続中の s を追加 */ /**************************************/ FD_SET(s, &rfds); /******************************************************/ /* select から 100000 マイクロ秒で返ってくるように指定 */ /******************************************************/ tv.tv_sec = 0; tv.tv_usec = 100000; /***********************************************************/ /* select システムコール */ /* rfds にリストされた入力のファイル・ディスクリプタを監視 */ /* タイムアウト時間は 100 ミリ秒 */ /***********************************************************/ select(FD_SETSIZE, &rfds, NULL, NULL, &tv); /**********************************************/ /* s が待ちなしで読み込めるかどうかのチェック */ /**********************************************/ if (FD_ISSET(s, &rfds)) { /* 待ちなしで読める */ /****************************/ /* s からのデータの読み込み */ /****************************/ read(s, read_buf, sizeof(read_buf)); printf("read_buf[]=%s\n", read_buf); if ((read_buf[0] == '0') && (read_buf[1] == '\n') && (read_buf[2] == '\0')) { printf("finished."); break; } } } /**********************/ /* ソケットのクローズ */ /**********************/ shutdown(s, 2); close(s); }