/* */ /* コネクション型のサーバプログラム (hellosv.c) */ /* Usage: hellosv host_name & */ /* */ #include #include #include #include #include #define PROT_NO 5001 static char mesg[] = "Hello world."; static struct sockaddr_in sv_addr; /* サーバアドレス */ static struct sockaddr_in cl_addr; /* クライアントアドレス */ static struct hostent *sv_ip; /* サーバIPアドレス */ static int sid1; /* デーモンソケット識別子 */ static int sid2; /* 子プロセスソケット識別子 */ static int cl_size; /* クライアントアドレスサイズ */ /* サーバメイン */ main(argc, argv) int argc; char *argv[]; /* argv[1]:サーバホスト名 */ { int rtn; /* 返却値 */ /* コネクション型ソケットの作成 (socket) */ sid1 = socket(AF_INET, SOCK_STREAM, 0); if (sid1 < 0) { perror("sv:socket"); goto err; } /* サーバのIPアドレスを取得 */ sv_ip = gethostbyname(argv[1]); if (sv_ip == NULL) { perror("sv:gethostbyname"); goto err; } /* ソケットに名前を付加 (bind) */ bzero((char *)&sv_addr, sizeof(sv_addr)); sv_addr.sin_family = AF_INET; sv_addr.sin_port = htons(PROT_NO); memcpy((char *)&sv_addr.sin_addr, (char *)sv_ip->h_addr, sv_ip->h_length); rtn = bind(sid1, &sv_addr, sizeof(sv_addr)); if (rtn < 0) { perror("sv:bind"); goto err; } /* クライアントからの接続要求の受付 (listen) */ rtn = listen(sid1, 5); if (rtn == -1) { perror("sv:listen"); goto err; } while (1) { /* クライアントからの接続要求の受信 (accept) */ cl_size = sizeof(cl_addr); sid2 = accept(sid1, &cl_addr, &cl_size); if (sid2 < 0) { perror("sv:accept"); goto err; } /* メッセージ通信処理 (send/recv) */ rtn = send(sid2, mesg, sizeof(mesg), 0); if (rtn < 0) perror("sv:send"); /* ソケットの開放 (shutdown,close) */ rtn = shutdown(sid2, 2); if (rtn < 0) perror("sv:shutdown"); close(sid2); } err: /* ソケットの開放 (close) */ close(sid1); exit(0); }