ソケット関数
ソケット(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