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

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

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

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

ネットワーク

ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

Q&A

2回答

1163閲覧

echoサーバ構築について

masuter0413

総合スコア50

C

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

ネットワーク

ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

0グッド

0クリップ

投稿2019/07/05 01:07

編集2022/01/12 10:55

学校の課題でechoサーバの構築をしています。
課題はおおまかなソースが与えられて、それに以下の点を加えて改良することです。
・エラー処理
・関数を用いて作り直す

エラー処理は自分で調べてだいたいはできた気がします。ただ,先生自作の教科書にある

c

1buf[n-2]='\0'

これはかなり手抜きのプログラムです。まず、相手から送られるデータが、 改行で終了していることを前提にしていますが、これは本来前提にしてはいけない部分です。今の場合、非常に短い文が送られてくることを期待して いるので、こうした手抜きをしています。もう一つ大事な点は、ネットワーク 上のデータでは改行は 0D0A の2byteであることです(Unixでは 改行は 0A の1byteで、Windowsなどでは 0D0A の2byteです)。 この n-2 は、最後が 0D0A で終了していることを想定していますが、 本来はきちんとプログラムすべきです( 0A しか来ない場合も想定しなければなりません)。

という記述の意味が,先生の説明では理解できませんでした。
・相手から送られるデータが改行コードでないことがあるのか
・改行コードでない場合,どういった処理をすればいいのかよく分かりません

c

1#include <sys/types.h> 2#include <sys/socket.h> 3#include <netinet/in.h> 4#include <netdb.h> 5#include <stdio.h> 6#include <errno.h> 7#include <err.h> 8#include <unistd.h> 9#include <string.h> 10#include <stdlib.h> 11#include <arpa/inet.h> 12 13int main(int argc, char *argv[]) { 14 struct addrinfo hints, *res; 15 struct sockaddr_storage from; 16 socklen_t fromlen; 17 int i, n, ls, s, ret; 18 int eroor; 19 fd_set rfd, rfd0; 20 char buf[2048], buf2[2048]; 21 22 if (argc != 2) { 23 fprintf(stderr, "usage: %s port\n", argv[0]); 24 exit(1); 25 } 26 memset(&hints, 0, sizeof(hints)); 27 hints.ai_socktype = SOCK_STREAM; 28 hints.ai_family = AF_INET; 29 hints.ai_flags = AI_PASSIVE; 30 31 eroor = getaddrinfo(NULL, argv[1], &hints, &res); 32 if (eroor) { 33 errx(1, "%s", gai_strerror(eroor)); 34 return 1; 35 } 36 37 while (res != NULL) { 38 s = socket(res->ai_family, res->ai_socktype, res->ai_protocol); 39 if (s < 0) { 40 res = res->ai_next; 41 } 42 else { 43 break; 44 } 45 } 46 /*if(res==NULL){exit(1)は必要か?}*/ 47 if (bind(s, res->ai_addr, res->ai_addrlen) < 0) { 48 perror("bind"); 49 close(s); 50 return -1; 51 }; 52 53 if (listen(s, 5) < 0) { 54 perror("listen"); 55 close(s); 56 return -1; 57 } 58 59 FD_ZERO(&rfd0); 60 FD_SET(s, &rfd0); 61 while (1) { 62 rfd = rfd0; 63 ret = select(FD_SETSIZE, &rfd, NULL, NULL, NULL); 64 if (ret < 0) { 65 perror("select"); 66 continue; 67 } 68 for (i = 0; i < FD_SETSIZE; i++) { 69 if (FD_ISSET(i, &rfd)) { 70 if ((ls = accept(i, NULL, NULL)) > 0) { 71 FD_SET(ls, &rfd0); 72 } 73 else { 74 n = read(i, buf, sizeof(buf)); 75 if (n < 0) { 76 perror("read"); 77 return -1; 78 } 79 if (strncmp("quit", buf, 4) == 0) { 80 close(i); 81 FD_CLR(i, &rfd0); 82 } 83 else { 84 buf[n - 2] = '\0'; 85 sprintf(buf2, "OK: %s\n", buf); 86 n = write(i, buf2, strlen(buf2) + 1); 87 if (n < 1) { 88 perror("write"); 89 break; 90 } 91 } 92 } 93 } 94 } 95 } 96 close(s); 97} 98

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

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

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

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

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

tetsunosuke

2019/07/05 01:34

タグについているEcho(フレームワーク) は Go言語のフレームワークなので不適切です。削除してください。 学校の課題であれば先生に聞くのが良いと思うのですが...
guest

回答2

0

プログラムは、正しいのかはわかりませんが。。

サーバとクライアントの決め事(プロトコル)しだいです。
メッセージの終端をCRLF(0x0D0A)とする決め事であれば、
0x0Aしか来ないこと場合は、タイムアウトするか、
プロトコルエラーとして処理するべきと思います。

0x0Aだけでも許容であれば、
0x0Aまで読み込んで、手前が0x0Dか判定すればいいと思います。

投稿2019/07/08 11:57

ai_2013_dev

総合スコア338

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

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

0

・相手から送られるデータが改行コードでないことがあるのか

当然あります。

・改行コードでない場合,どういった処理をすればいいのかよく分かりません

普通のechoサーバーであるなら、1バイト読んで、その1バイトを書く、というのを繰り返すというだけで良いです。改行コードかどうかとか意識する必要は無い。

お書きのプログラムは、"OK:"と表示したり、入力が"quit"かどうか判断していたり、ということで、普通のechoサーバーじゃないので、求められている仕様を確認しましょう。

投稿2019/07/05 05:56

otn

総合スコア84423

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問