ネットワーク・プログラミング TCPサーバ.

Slides:



Advertisements
Similar presentations
ネットワーク・プログラミ ング カーネルの役割とプロセス生成. 1.1 OS の役割 仮想マシン OS はハードウェアの多様性 をカプセル化し、利用者を 複雑な処理から開放する。 プロセス管理 時間多重化により各プロセ スに CPU を割当てる。 メモリ管理 メモリ空間の多重化により、 各プロセスにメモリを割当.
Advertisements

プロセスの生成とコマンドの実行 プロセスの生成とコマンドの実行 プロセス生成のシステムコール プロセス生成のシステムコール プロセス生成のプログラム例 プロセス生成のプログラム例 プログラム実行のシステムコール プログラム実行のシステムコール 子プロセスの終了を待つシステムコール 子プロセスの終了を待つシステムコール.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
システムコール 低水準入力 ファイルディスクリプタ ソケット
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
ネットワークプログラミング 第7回「ネットワークとプログラミング(2)」
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
システムプログラミング 第13回 情報工学科 篠埜 功.
CS-B3 ネットワークプログラミング 峰野博史
OSとコマンド OS:コンピュータを使うための基本プログラム コマンド:OS上で使用できる命令 OS本体であるカーネルの内部コマンド
第8回ネットワークプログラミング 中村 修.
Windows Network Programming
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング システムプログラミング プロセス間通信(パイプ) 担当:青木義満
TCPソケットプログラミング ソケットプログラミング TCP-echoのデータ通信手順
輪講: 詳解TCP/IP ACE B3 suzuk.
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング 第11回 プロセス間通信4 仮想FTPの実現 担当:青木義満
第5回ネットワークプログラミング 中村 修.
P2P方式によるオンラインゲームの研究、開発
Parallel Programming in MPI part 1
TCP/UDP プロセス間の通信のためのプロトコル TCP:信頼性高、処理時間大 UDP:信頼性低、処理時間小 ftp SMTP HTTP
第11回ネットワークプログラミング 中村 修.
システムプログラミング 第13回 プロセス間通信(続き) 情報工学科 篠埜 功.
第7回ネットワークプログラミング 中村 修.
RPC:Remote Procedure Call Protocol Specification
UDPエコーサーバ UDP-echoサーバのプログラムモデル(Cプログラム) サーバで利用するソケット関数(Cプログラム)
システムプログラミング 第13回 情報工学科 篠埜 功.
ソケットプログラム(TCP,UDP) EasyChat開発
システムプログラミング 第12回 プロセス間通信 情報工学科 篠埜 功.
岡村耕二 トランスポート層 岡村耕二 情報ネットワーク.
マルチスレッド処理 マルチプロセス処理について
岡村耕二 トランスポート層 ソケットプログラミング 岡村耕二 情報ネットワーク.
岡村耕二 トランスポート層 岡村耕二 情報ネットワーク.
プログラミング 4 記憶の割り付け.
ソケットプログラム(TCP,UDP) EasyChat開発2
インターネットにおける真に プライベートなネットワークの構築
ユビキタスシステムアーキテクチャ 第5回 ネットワークプログラミングの基礎
Ibaraki Univ. Dept of Electrical & Electronic Eng.
UDPマルチキャストチャット    空川幸司.
第11回 プログラミングⅡ 第11回
ネットワークプログラミング (5回目) 05A1302 円田 優輝.
Parallel Programming in MPI part 1
Webプロキシ HTTP1.0 ヒント CS-B3 ネットワークプログラミング  &情報科学科実験I.
ネットワークプログラミング (3回目) 05A1302 円田 優輝.
TCP/IPとプロセス間通信 2007年1月12日 海谷 治彦.
Talkプログラムのヒント 1 CS-B3 ネットワークプログラミング  &情報科学科実験I.
岡村耕二 トランスポート層 岡村耕二 情報ネットワーク.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
ネットワーク・プログラミング ソケットオプションとスレッド.
岡村耕二 トランスポート層 岡村耕二 情報ネットワーク.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
岡村耕二 TCP通信プログラム 課題と回答例 岡村耕二 情報ネットワーク.
システムプログラミング 第12回 プロセス間通信 情報工学科 篠埜 功.
システムプログラミング 第12回 プロセス間通信 情報工学科 篠埜 功.
ネットワーク・プログラミング デバイスドライバと環境変数.
ネットワーク・プログラミング Cプログラミングの基礎.
システムプログラミング 第10回 プロセス間通信3 簡易Web server(準備) Chat プログラム 担当:青木義満、篠埜 功
岡村耕二 TCP通信プログラム 岡村耕二 情報ネットワーク.
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング 第11回 プロセス間通信4 仮想FTPの実現 担当:青木義満
ネットワーク・プログラミング 非同期I/Oとスレッド同期制御.
ネットワーク・プログラミング メッセージの作成とセマフォ.
ネットワーク・プログラミング ソケットプログラミングと共有メモリ.
ネットワーク・プログラミング 1対多のプロセス間通信.
ネットワーク・プログラミング パイプライン通信とシグナル.
ネットワーク・プログラミング マルチタスク.
ネットワーク・プログラミング プロセスとファイルシステム管理.
TCP/IPの通信手順 (tcpdump)
ソケットの拡張によるJava用分散ミドルウエアの高信頼化
第6章 インターネットアプリケーション 6.1 インターネットアプリケーション 6.2 Javaによるネットワーク処理 6.3 電子メール
ポートスキャン実習 2002年9月19日 修士1年 兼子 譲 牧之内研究室「インターネット実習」Webページ
岡村耕二 TCP通信プログラム 岡村耕二 情報ネットワーク.
Presentation transcript:

ネットワーク・プログラミング TCPサーバ

全体の位置づけ オペレーションシステム(Linux) ソケットプログラミング プロセス カーネルとシステムコール プロセス間通信 スレッド クライアントーサーバ 非同期I/Oとマルチタスク

プロセスは立上って、待っていなければいけない。 1.1 TCPエコーサーバ プロセスは立上って、待っていなければいけない。 1. socket()を実行 (ソケット作成) ↓ 2. bind()を実行 (ソケットにサーバのポート番号を割当る) 3. listen()を実行 (接続要求をキューに入れる) 4. accept()を実行 (接続要求毎に新しいソケットを作成) 5. send()とrecv()を実行 (通信を行う) 6. close()を実行 (ソケット削除) TCPEchoClient TCPEchoServer socket() bind() listen() accept() サービス受付開始 socket() コネクション設定 connect() サービス開始 Echo this send() recv() recv() Echo this send() コネクション開放 close() close()

bind()によって、指定したポート番号に割当られる 1.2 TCPエコーサーバ  システムコール1 サーバのアドレス ソケットにポート番号を割当る int bind(int socket, struct sockaddr *localAddress, unsigned int addressLength) 戻値:成功: 0、失敗: -1 AP AP ソケット ソケット ポート番号は適当に割当られる bind()によって、指定したポート番号に割当られる 1 2 65535 1 2 7 65535 TCP TCP IP IP クライアント サーバ

1.3 TCPエコーサーバ システムコール2 接続要求をキューに入る 接続要求毎に新しいソケットを作成 接続要求を同時に受入れる最大値 接続要求をキューに入る int listen(int socket, int queueLimit) 戻値:成功: 0、失敗: -1 接続要求毎に新しいソケットを作成 int accept(int socket, struct sockaddr *clientAddress, unsigned int *addressLength) 戻値:成功: ソケット識別子、失敗: -1 クライアントのアドレス クライアント1用ソケット 接続要求に対するソケット クライアント2用ソケット ユーザプロセス listen() accept() accept() queueLimit番目 カーネル TCP accept()待ちキュー クライアント1 クライアント2

1.4 TCPエコーサーバ プログラム その1 TCPEchoServer.c その1 TCPEchoServer #define MAXPENDING 5 /* 最大キュー長 */ void DieWithError(char *errorMessage); /* エラー処理 */ void HandleTCPClient(int clntSocket); /* TCPクライアント処理 */ int main(int argc, char *argv[]) { int servSock; /* サーバのソケット識別子 */ int clntSock; /* クライアントのソケット識別子 */ struct sockaddr_in echoServAddr; /* ローカルアドレス */ struct sockaddr_in echoClntAddr; /* クライアントアドレス */ unsigned short echoServPort; /* サーバポート */ unsigned int clntLen; /* クライアントアドレス構造体長 */ echoServPort = atoi(argv[1]); /* 引数1はローカルポート番号 */ /* 接続要求に対するソケットを作成 */ if ((servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) DieWithError("socket() failed"); /* ローカルアドレス構造体を作る */ memset(&echoServAddr, 0, sizeof(echoServAddr)); /*構造体を初期化*/ echoServAddr.sin_family = AF_INET; /* インタネットアドレス族 */ echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY); /*ワイルドカード*/ echoServAddr.sin_port = htons(echoServPort); /* ローカルポート */ プロセスは待機中 TCPEchoClient TCPEchoServer Yahoo Yahoo 受信インタフェースを指定しない [oida@rpc261 socket]$ gcc -o TCPEchoServer TCPEchoServer.c HandleTCPClient.c DieWithError.c [oida@rpc261 socket]$ ./TCPEchoServer 5000 Handling client 150.43.220.22 サーバのポート番号

1.5 TCPエコーサーバ プログラム その2 TCPEchoServer.c その2 /* ローカルアドレスにバインドする */ if (bind(servSock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0) DieWithError("bind() failed"); /* クライアントからの接続要求を待つ */ if (listen(servSock, MAXPENDING) < 0) DieWithError("listen() failed"); for (;;) /* 処理を繰返す */ { /* 入出力パラメータのサイズをセットする */ clntLen = sizeof(echoClntAddr); /* 接続要求に対して新しいソケットを作成 */ if ((clntSock = accept(servSock, (struct sockaddr *) &echoClntAddr, &clntLen)) < 0) DieWithError("accept() failed"); printf("Handling client %s\n", inet_ntoa(echoClntAddr.sin_addr));    /* TCPクライアント処理関数を呼ぶ */ HandleTCPClient(clntSock); } サーバのアドレス 接続要求を同時に受入れる最大値 クライアントのアドレス 接続要求に対するソケット

からのメッセージ或いは、closeを待つ 1.6 TCPエコーサーバ プログラム その3 HandleTCPClient() #define RCVBUFSIZE 32 /* Size of receive buffer */ void DieWithError(char *errorMessage); /* エラー処理 */ void HandleTCPClient(int clntSocket) { char echoBuffer[RCVBUFSIZE];  /* エコーバッファ */ int recvMsgSize; /* 受信メッセージ長 */ if ((recvMsgSize = recv(clntSocket, echoBuffer, RCVBUFSIZE, 0)) < 0)  /* クライアントからメッセージ受信 */ DieWithError("recv() failed"); while (recvMsgSize > 0) /* 0は転送終了を意味する */ if (send(clntSocket, echoBuffer, recvMsgSize, 0) != recvMsgSize)    /* メッセージをクライアントに返す */ DieWithError("send() failed"); if ((recvMsgSize = recv(clntSocket, echoBuffer, RCVBUFSIZE, 0)) < 0)  /* 受信データがあるか確認する */ } close(clntSocket); /* クライアントソケットを終了する */ クライアント用ソケット識別子 一度に受信可能なバイト数(32) 受信状態で、クライアント からのメッセージ或いは、closeを待つ

宿題9 TCPEchoClient.c, TCPEchoServer.c, HandleTCPClient.c, DieWithError.cを使って、TCPEchoClientとTCPEchoServerを作成し、プログラムの実行結果を報告せよ(可能であれば、クライアントとサーバは異なるコンピュータ上で実行せよ)。 表紙に氏名と学籍番号を書く プログラムの実行結果を書く 実施した内容を説明する文章を書く レポートの締切は次の週の水曜日18:00 TCPEchoClient TCPEchoServer Yahoo Yahoo Jazz Jazz サーバ用とクライアント用にTeraTermを二つ立ち上げる [oida@rpc261 socket]$ gcc -o TCPEchoServer TCPEchoServer.c HandleTCPClient.c DieWithError.c [oida@rpc261 socket]$ ./TCPEchoServer 5000 Handling client 150.43.220.22 同じコンピュータ上で同じポート番号は使えない [oida@rpc261 socket]$ gcc -o TCPEchoClient TCPEchoClient.c DieWithError.c [oida@rpc261 socket]$ ./TCPEchoClient 150.43.220.22 "Yahoo" 5000 Received: Yahoo [oida@rpc261 socket]$ ./TCPEchoClient 150.43.220. 22 "Jazz" 5000 Received: Jazz [oida@rpc261 socket]$ サーバのIPアドレス /sbin/ifconfig サーバのポート番号