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

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

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

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

Q&A

0回答

1718閲覧

エコーサーバーにするには

Beginnerman

総合スコア19

C

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

0グッド

0クリップ

投稿2020/06/22 14:19

クライアントから入力された文字列をサーバー側で表示するプログラムがあります。
このプログラムをechoサーバーにし、サーバーが受信メッセージをクライアントにエコーバックするようにしたいです。

サーバー側のソースコード

#include <stdlib.h> // atoi #include <stdio.h> // printf #include <unistd.h> // close #include <sys/socket.h> // socket #include <arpa/inet.h> // inet_addr, htons, inet_ntoa, ntohs #define CHECK_CLIENT 1 int main(int argc, char *argv[])  { int len; char buff[4096]; struct sockaddr_in sa = { 0 }; // 自分のソケットアドレス格納用 #if CHECK_CLIENT struct sockaddr_in sa2 = { 0 }; // 相手のソケットアドレス格納用 int sa_len; #endif int opt = 1; int sock = socket(AF_INET, SOCK_DGRAM, 0); // UDPソケット生成 setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); // 自分用のソケットアドレスの作成 sa.sin_family = AF_INET; // プロトコルはIPv4 sa.sin_port = htons(atoi(argv[1])); // ポート番号をセット sa.sin_addr.s_addr = inet_addr("0.0.0.0");// IPアドレスをセット // ソケットアドレスをバインド bind(sock, (struct sockaddr *)&sa, sizeof(struct sockaddr_in)); while (1) { #if CHECK_CLIENT // 送信元を特定する場合 sa_len = sizeof(struct sockaddr_in); // この記述は毎度必要 len = recvfrom( sock, buff, 4096, 0, (struct sockaddr *)&sa2, &sa_len); buff[len] = ’\0’; printf("[%s:%d] %s\n", inet_ntoa(sa2.sin_addr), ntohs(sa2.sin_port), buff); #else // 送信元を特定しない場合 len = recvfrom(sock, buff, 4096, 0, NULL, NULL); write( 1, buff, len); #endif } close(sock); return 0; }

クライアント側のソースコード

#include <stdlib.h> // atoi #include <unistd.h> // close #include <sys/socket.h> // socket #include <arpa/inet.h> // inet_addr, htons int main(int argc, char *argv[]) { struct sockaddr_in sa = { 0 }; // ソケットアドレス構造体 int len; char buff[4096]; int sock = socket(AF_INET, SOCK_DGRAM, 0); // UDPソケット生成 // 通信相手のソケットアドレスを作成 sa.sin_family = AF_INET; // プロトコルはIPv4 sa.sin_port = htons(atoi(argv[2])); // ポート番号をセット sa.sin_addr.s_addr = inet_addr(argv[1]); // IPアドレスをセット while (0 < (len = read(0, buff, 256))) { sendto( sock, buff, len - 1, 0, (struct sockaddr *)&sa, sizeof(sa)); // 改行を消して送信 } close(sock); return 0; }

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

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

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

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

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

hope_mucci

2020/06/23 12:32

サーバー側で受信したバッファをそのまま`sendto`で返し、クライアント側で`resv`を使って受け取るだけです。クライアントからの送信→サーバで受信はできているので、その逆を行うだけですが、どのような点を質問したいのでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問