現在チャットができるようなクライアントとサーバーのプログラムを作成しているのですが、サーバープログラムを実行した後に別のターミナルでクライアントプログラムを実行しているのですがどうしてもうまくいかず実行自体ができていません。
ターミナルで何をどのように入力したら良いか教えてください。ソースコードも一応できでいるのですが、おそらく結構な部分間違っているのでご了承ください。一応乗せておきます
・サーバープログラム
c
1#include <stdio.h> 2#include <sys/types.h> 3#include <sys/socket.h> 4#include <sys/time.h> 5#include <unistd.h> 6#include <netinet/in.h> 7 8#define PORT 19991 9#define MAX_CLIENT 5 10#define FREE 100 11 12 13main() 14{ 15 int i, j, n, *server, *clients, sockets[MAX_CLIENT+2], len, p; 16 fd_set fds; 17 struct sockaddr_in saddr; 18 struct sockaddr_in caddr; 19 static char buf[100], x[100]; 20 21 22 /* Intalize a socket ------------------------------------------ */ 23 24 server = sockets; 25 clients = sockets+1; 26 if ((*server = socket(AF_INET, SOCK_STREAM, 0)) < 0) { 27 perror("socket"); 28 exit(1); 29 } 30 /* Bind the socket -------------------------------------------- */ 31 saddr.sin_family = AF_INET; 32 saddr.sin_addr.s_addr = INADDR_ANY; 33 saddr.sin_port = htons(PORT); 34 if (bind(*server,(struct sockaddr *)&saddr,sizeof(struct sockaddr_in))<0) { 35 perror("bind"); exit(1); 36 } 37 /* Wait to someone connect to this server --------------------- */ 38 if (listen(*server, MAX_CLIENT) < 0) { 39 perror("listen"); exit(2); 40 } 41 /* Clear all clients ------------------------------------------ */ 42 for (i=0; i <= MAX_CLIENT; i++) clients[i]=FREE; 43 /* Main loop -------------------------------------------------- */ 44 for (;;) { 45 /* Initalize fd_set ----------------------------------------- */ 46 FD_ZERO(&fds); 47 for (i=0; i < MAX_CLIENT+1; i++) { 48 if (sockets[i] != FREE) FD_SET(sockets[i], &fds); 49 printf("sokects[%d]=%d\n", i, sockets[i]); 50 } 51 /* Check message arrivals ----------------------------------- */ 52 if ((n = select(FD_SETSIZE, &fds, NULL, NULL, NULL)) == -1) { 53 perror("select"); exit(3); 54 } 55 /* Processing Loop ------------------------------------------ */ 56 for (i=0; i < MAX_CLIENT; i++) { 57 if (clients[i] != FREE) { 58 if (FD_ISSET(clients[i], &fds)) { /* A Message is exist */ 59 if ((len = read(clients[i], buf, 100))==-1) { 60 perror("read"); exit(4); 61 } else if (len != 0) { 62 if (strncmp(buf, "quit", 4) != 0) { 63 printf("A message from a client (%d) is arrived.\n", i); 64 printf("client[%d]:%s\n", i, buf); 65 for(p = 0; p <= i; p++) { 66 write(clients[p], buf, 100); 67 bzero(buf, 100); 68 } 69 70 } else { 71 printf("A client (%d) leaved.\n", i); 72 close(clients[i]); clients[i] = FREE; 73 } 74 } else { 75 close(clients[i]); clients[i] = FREE; 76 printf("A client (%d) leaved.\n", i); 77 } 78 } 79 } 80 } 81 /* New connection -------------------------------------------*/ 82 if (FD_ISSET(*server, &fds) != 0) { 83 len = sizeof(caddr); 84 for (i=0; i < MAX_CLIENT; i++) { 85 if (clients[i] == FREE) break; 86 } 87 clients[i] = accept(*server, (struct sockaddr*)&caddr, &len); 88 if (clients[i] == -1) { 89 perror("accept"); exit(5); 90 } 91 if (i < MAX_CLIENT) { 92 printf("A new client (%d) is accepted.\n", i); 93 } else { 94 printf("A client is refused.\n"); 95 write(clients[i], "Server is too busy.\n", 20); 96 close(clients[i]); 97 clients[i]=FREE; 98 } 99 } 100 } 101} 102 103 104
クライアントプログラム
c
1#include <stdio.h> 2#include <sys/types.h> 3#include <sys/socket.h> 4#include <netinet/in.h> 5#include <netdb.h> 6 7#define PORT 19991 8 9main(int argc, char *argv[]) 10{ 11 int i, s, t, len; 12 struct sockaddr_in addr; 13 struct hostent *hp; 14 static char buf[100]; 15 16 if (argc != 2) { 17 fprintf(stderr, "Usage: net_client serverhost\n"); 18 exit(1); 19 } 20 21 if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) { 22 perror("socket"); 23 exit(1); 24 } 25 if ((hp = gethostbyname(argv[1])) == NULL) { 26 perror("gethostbyname"); 27 exit(1); 28 } 29 30 bcopy(hp->h_addr, &addr.sin_addr, hp->h_length); 31 addr.sin_family = AF_INET; 32 addr.sin_port = htons(PORT); 33 34 if (connect(s, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0) { 35 perror("connect"); 36 exit(1); 37 } 38 39 while (fgets(buf, 100, stdin)) { 40 write(s, buf, 100); 41 read(s, buf, 100); 42 printf("%s", buf); 43 bzero(buf, 100); 44 } 45 close(s); 46} 47
プログラム はこんな感じです。サーバーの方はコンパイル後「./snet_server 19991」か「./snet_server 127.0.0.0 19991 」どちらかで実行してます。クライアントがうまく実行できません。どのように打てばいいか教えてください。
初めて書くので見にくかったり書き方が下手だとは思うんですけどよろしくお願いします。
netstat -antのコマンドを実行するとserverプログラムが”LISTEN”状態になっているのでこちらは問題なく動作していると思います。ただAddressが見えないのでそのアドレスをクライアント側の引数に入れると動作すると思っています。
Proto Recv-Q Send-Q Local Address Foreign Address (state)
tcp4 0 0 *.19991 . LISTEN