INET STREAM 型の通信


最も一般的なネットワーク通信の形態である INET STREAM 型の 通信を行います。これは TCP/IP とよばれる通信プロトコルです。

接続の目印にはポートと呼ばれる番号を使います。


まずサーバー側のプログラムから見てみましょう。名前は inettcps.cc です。
INET STREAM server : inettcps.cc のソースintegnet.h のソース

// INET で STREAM な TCPソケットによる通信プログラムの雛型 (サーバー側) #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include "integnet.h" // 接続のポート #define PORT 12345 int main( void ) { // INET で STREAM なソケットの作成 int sb = socket( AF_INET, SOCK_STREAM, 0 ); // 接続の目印の指定 sockaddr_in addr = SOCKADDR_IN_INIT( AF_INET, htons(PORT), InAddr(htonl(INADDR_ANY)) ); // 目印の公開 if( bind( sb, (sockaddr*)&addr, sizeof(addr) ) < 0 ){ perror("bind"); exit(1); } // 接続要求の受信開始(同時に1回線まで接続可とする) listen( sb, 1 ); // 接続要求の受信 int s = accept( sb, NULL, NULL ); // データの受信 char msg[64]; int len = recv( s, msg, sizeof(msg), 0 ); msg[len] = '\0'; // データの表示 printf("Server received : %s\n", msg ); // ソケットの廃止 close(s); close(sb); return 0; }

ソケットを AF_INET, SOCK_STREAM で作成します。

bind, listen, accept の使い方はこれまで説明した方法の集大成です。


次にクライアント側のプログラムを見てみましょう。名前は inettcpc.cc です。
INET STREAM client : inettcpc.cc のソース

// INET で STREAM な TCPソケットによる通信プログラムの雛型 (クライアント側) #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include "integnet.h" // 接続のポート #define PORT 12345 #define HOST "127.0.0.1" int main( void ) { // INET で STREAM なソケットの作成 int s = socket( AF_INET, SOCK_STREAM, 0 ); // 接続の目印の指定 sockaddr_in addr = SOCKADDR_IN_INIT( AF_INET, htons(PORT), InAddr(HOST) ); if( h_errno ){ herror("gethostbyname"); exit(1); } // ソケットの回線への接続 if( connect( s, (sockaddr*)&addr, sizeof(addr) ) < 0 ){ perror("connect"); exit(1); } // 送信するデータ char msg[64] = "This is client."; // データの送信 send( s, msg, sizeof(msg), 0 ); // 回線の切断 close(s); return 0; }

connect関数がクライアント側の空きポートを見つけて、 それを通信に使うことを先に説明しました。 あとは何も説明は要らないでしょう。


目次

Copyright(C) by Naoki Watanabe. Jan 1st, 2001.
渡辺尚貴 naoki@cms.phys.s.u-tokyo.ac.jp