クライアントから入力された文字列をサーバー側で表示するプログラムがあります。
このプログラムを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; }
サーバー側で受信したバッファをそのまま`sendto`で返し、クライアント側で`resv`を使って受け取るだけです。クライアントからの送信→サーバで受信はできているので、その逆を行うだけですが、どのような点を質問したいのでしょう。
あなたの回答
tips
プレビュー