質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

1回答

1562閲覧

クライアントとサーバーの実行方法について

Lucise

総合スコア10

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2018/10/14 15:34

編集2022/01/12 10:55

現在チャットができるようなクライアントとサーバーのプログラムを作成しているのですが、サーバープログラムを実行した後に別のターミナルでクライアントプログラムを実行しているのですがどうしてもうまくいかず実行自体ができていません。

ターミナルで何をどのように入力したら良いか教えてください。ソースコードも一応できでいるのですが、おそらく結構な部分間違っているのでご了承ください。一応乗せておきます

・サーバープログラム

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2018/10/14 16:11 編集

ソースを<code>で整形して下さい。
Lucise

2018/10/14 16:39

上のは間違いました。これで整形できてますか?
asm

2018/10/14 23:25

どちらもクライアントに見えますがあっていますか?
Lucise

2018/10/14 23:41

すいません。間違って同じのを貼り付けてました。
YAmaGNZ

2018/10/15 03:31

説明文も見直してください。サーバは引数を処理してなさそうですが、実行時に引数指定しているのですか?クライアント側はどのように実行しているのですか?
Lucise

2018/10/15 03:57

サーバーは引数取ってないので入りませんでした。クライアント側は引数を指定しないといけないのですが、gethostbyname(argv[1])でホストを指定すればいいと思ったので./ファイル名 localhostでいけるのかと思って実行したら「connect: Connection refused」と出ました。
guest

回答1

0

あなたが組んだコードはあなたが一番良く知ってるはずです。
このコードはどういうふうに実行するようにコードを組んだんですか?

コードが間違っているにしても、実行方法を他人に聞くのはおかしいですね

で、Windowsで組んでるなら、VisualStudioとかEclipseとかのデバッグできる実行環境を入れましょう。
その上で実行すれば、コードの任意の箇所で実行を止め、変数のナカミを見ることができます。
また、そこから1行づつ実行できるようになります。
まずそうやってデバッグして、自分の思うように動くように修正していきましょう

投稿2018/10/15 00:37

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lucise

2018/10/15 03:12

サーバープログラムの方はポート番号を19991にして実行してクライアントプログラム の方はargv[1]がポート番号にして読み取りサーバーに接続できると思ったのですが「connect: No route to host」と出て詰まっている状況です
Lucise

2018/10/15 03:13

ちなみにmacで組んでます
y_waiwai

2018/10/15 03:18 編集

MacでもCのデバッグ環境(統合環境)はあるようですので、それを入れておくことをお勧めします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問