EchoServerV2
EchoServer - Shammerismに書いた EchoServer を見直し、少し修正した。
変換点は以下。
- sin_addr.s_addr で INADDR_ANY を使用していたのでリスンアドレス用引数は省略し、使用するポートのみに変更
- 引数はポートを想定しているので、数値になっているかを確認。
要は、引数の見直しと引数文字列変換改良版 - Shammerismの成果を取り込んだ形だ。まだ動作確認はしておらず、とりあえずコンパイルしてリスンしているかのように見えるだけの状態。実装は以下のようになった。
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <netinet/in.h> #include <unistd.h> #include <ctype.h> int checknumber(char *v){ int len = strlen(v); int i; int result = 1; for(i = 0; i < len && result ; i++){ result = isdigit(v[i]); } return result; } int main(int argc, char *args[]) { if (argc != 2) { printf("Usage: %s $ListenPort\n", args[0]); return 1; } if ( checknumber(args[1]) ){ struct sockaddr_in server_addr; struct sockaddr_in client_addr; int port = atoi(args[1]); int listen_fd; int conn_fd; int rsize; char receive_buffer[1024]; // Passive Open if (( listen_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) { perror("socket"); return 2; } // 0 clear server_addr structure bzero((char *)&server_addr, sizeof(server_addr)); // Initialize server socket structure and bind server socket server_addr.sin_family = PF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_port = htons(port); if ( bind(listen_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0 ) { perror("bind"); return 3; } // Port Listen if ( listen(listen_fd, SOMAXCONN) < 0 ) { perror("listen"); return 4; } printf("Start Listening Port : %d...\n", port); // Accept Client connection request unsigned int len = sizeof(client_addr); if ( (conn_fd = accept(listen_fd, (struct sockaddr *)&client_addr, &len )) < 0 ) { perror("accept"); return 5; } // Close Server Socket close(listen_fd); // Read client data do { rsize = recv(conn_fd, receive_buffer, 1024, 0); if ( rsize == 0 ) { // Disconnect from client break; } else if ( rsize == -1 ) { perror("recv"); return 6; } else { write(conn_fd, receive_buffer, rsize); } } while (1); // Close Client Socket if ( close(conn_fd) < 0 ) { perror("close"); return 7; } printf("Connection closed.\n"); return 0; } }
実行させた時の様子。
$ ./a.out 10080 Start Listening Port : 10080...
ここだけみるといかにも通信できそうだが・・・