C言語にて ソケット関数を使って エコーサーバを作成する

ソケット関数

ソケット(Socket) とはプロセス間通信のためのインターフェースです。
コンピュータ間通信にも使用される。

ソケットに関するシステムコールC言語プログラミング
http://itref.fc2web.com/unix/socket.html

ソケット関数とはソケットを扱うC言語の関数の総称です。

代表的なソケット関数

socket - 通信のための端点 (endpoint) を作成する
https://linuxjm.osdn.jp/html/LDP_man-pages/man2/socket.2.html

エコーサーバ

クライアントがそ送信したデータを受信したときに、 受信したデータをそのままクライアントに返送する簡素な仕様のサーバです。

エコーサーバを作成する

下記を参考にした。
TCP/IPネットワークプログラミング
http://onishi-lab.jp/programming/tcp_linux.html

socket, bind, listen, accept などの関数を使用する。
これらは OSのシステムコールです。

SOCKET
https://linuxjm.osdn.jp/html/LDP_man-pages/man2/socket.2.html

BIND
https://linuxjm.osdn.jp/html/LDP_man-pages/man2/bind.2.html

LISTEN
https://linuxjm.osdn.jp/html/LDP_man-pages/man2/listen.2.html

ACCEPT
https://linuxjm.osdn.jp/html/LDP_man-pages/man2/accept.2.html

下記のようなコードになる。

// TCPソケットを作成する
int sfd = socket(AF_INET, SOCK_STREAM, 0);

// ソケットの再使用を有効にする
const int reuse_yes = 1;
setsockopt( sockfd,
   SOL_SOCKET, SO_REUSEADDR, (const char *)&reuse_yes, sizeof(reuse_yes) );

// 待ち受けするポート番号を指定してアドレス構造体を作成する
struct sockaddr_in addr;

bzero((char *)&addr, sizeof(addr_listen));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons(port);

// ソケットにアドレス構造体を割り当てる
bind( sockfd, (struct sockaddr *)&addr, sizeof(addr) );

// 待ち受けする
listen(sockfd, 10);

// 接続したクライアントを受け入れる
struct sockaddr_in addr_client;

int sock_client = accept(sockfd, (struct sockaddr *)&addr_client,  sizeof(addr_client) );

// クライアントからのデータを受信する
char buf[100];

read(sock_client, buf, 100);

// クライアントへデータを返送する
write( sock_client, buf, strlen(buf) );

コード全体は github に公開した。 https://github.com/ohwada/MAC_cpp_Samples/tree/master/network/tcp