Talkプログラムのヒント 1 CS-B3 ネットワークプログラミング  &情報科学科実験I.

Slides:



Advertisements
Similar presentations
C 言語講座第 5 回 構造体. 構造体とは ... 異なる型の値をまとめて新しい型とする 機能がある . つまり , 複数の変数を 1 つのまとまりにできる . 配列と違って同じ型でデータをまとめるのではな く違った型のデータをまとめられる .
Advertisements

情報アプリケーション1 2006 年 10 月 12 日 第四回資料 担当 重定 如彦. 目次 データの送信とフォーム クイズ CGI 複数のパーツのデータの分割方法 配列変数.
オブジェクト指向言語・ オブジェクト指向言語演習 中間試験回答例. Jan. 12, 2005 情報処理技術基礎演習 II 2 オブジェクト指向言語 中間試験解説 1  (1) 円柱の体積(円柱の体積 = 底面の円の面積 x 高さ) を求めるプログラムを作成しなさい。ただし、出力結果は、入 力した底面の円の半径.
The Perl Conference Japan ’98 朝日奈アンテナによる コンテンツ情報の取得と利用
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
パワーポイントの使い方 東京女子大学 情報処理センター 浅川伸一.
4章 制御の流れ-3.
プログラミング言語としてのR 情報知能学科 白井 英俊.
IO - 入出力 小西 亨.
6/19 前回復習 for文による繰り返し計算 演習1:1から10まで足して画面に結果を表示する 提出者: 1人
情報理工学部 情報システム工学科 ラシキアゼミ3年 H 岡田 貴大
伺か with なでしこ 発表者:しらたま /05/05 うかべん大阪#3.
リダイレクト パイプ 標準入出力プログラム コマンド行引数 関数 system()
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
VBA H106077 寺沢友宏.
第2回ネットワークプログラミング 中村 修.
文字配列の課題1 解説 /* a */ #include <stdio.h> main( ) { int i;
第13回 プログラミングⅡ 第13回
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング システムプログラミング プロセス間通信(パイプ) 担当:青木義満
の まとめ 2007/04/02 (Mon) / d;id:hzkr
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
デバイスからの異常注入が指定可能なCPUエミュレータ
ファイル操作と文字列の利用.
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング 第11回 プロセス間通信4 仮想FTPの実現 担当:青木義満
(B2) 親: minami, kazuki 多様な認証機器に対応する 認証システム (B2) 親: minami, kazuki.
情報処理Ⅱ 第13回 2004年01月25日(火).
情報工学科 3年生対象 専門科目 システムプログラミング 第5回、第6回 ヒアドキュメント レポート課題 情報工学科 篠埜 功.
P2P方式によるオンラインゲームの研究、開発
Cプログラミング演習 中間まとめ2.
プログラミング 2 ファイル処理.
UDPエコーサーバ UDP-echoサーバのプログラムモデル(Cプログラム) サーバで利用するソケット関数(Cプログラム)
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング 第10回 プロセス間通信3 担当:青木義満
ソケットプログラム(TCP,UDP) EasyChat開発
マルチスレッド処理 マルチプロセス処理について
プログラミング 4 記憶の割り付け.
ソケットプログラム(TCP,UDP) EasyChat開発2
リダイレクト パイプ 標準入出力プログラム コマンド行引数 関数 system()
プログラミング演習I 2003年6月25日(第10回) 木村巌.
第6回:ラケットを動かそう! (キーボードによる物体の操作)
ネットワークプログラミング (5回目) 05A1302 円田 優輝.
Webプロキシ HTTP1.0 ヒント CS-B3 ネットワークプログラミング  &情報科学科実験I.
第5回 個人の動画配信補足のためのWeb構築
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
第4回 ファイル入出力方法.
ネットワークプログラミング 05A1302 円田 優輝.
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
OSが管理している、デフォルトの入出力装置 入力:stdin キーボード 出力:stdout モニタ(コマンドプロンプトの画面)
統計ソフトウエアRの基礎.
手書き文字の自動認識アプリケーション 15K1013 坂本 倖輝
プログラミング演習I 2003年7月2日(第11回) 木村巌.
vc-3. ダンプリスト,配列 (Visual Studio C++ の実用知識を学ぶシリーズ)
ファイルの読み込み, ファイルからのデータの取り出し, ファイルの書き出し
システムプログラミング 第10回 プロセス間通信3 簡易Web server(準備) Chat プログラム 担当:青木義満、篠埜 功
vc-3. ダンプリスト,配列 (Visual Studio C++ の実用知識を学ぶシリーズ)
岡村耕二 TCP通信プログラム 岡村耕二 情報ネットワーク.
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング 第11回 プロセス間通信4 仮想FTPの実現 担当:青木義満
プログラミング基礎演習 第4回.
情報処理Ⅱ 2007年12月3日(月) その1.
ネットワーク・プログラミング TCPサーバ.
コンパイラ 2012年10月11日
アルゴリズムとデータ構造 補足資料6-1 「サンプルプログラムcat1.c」
ネットワーク・プログラミング 1対多のプロセス間通信.
岡村耕二 UDP通信プログラム 課題と回答例 岡村耕二 情報ネットワーク.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
3.1 シューティングゲームの当たり判定 当たったら死亡.
Webプロキシ HTTP1.1 ヒント CS-B3 ネットワークプログラミング  &情報科学科実験I.
コンピュータープログラミング (C言語)(10) 1.ファイル入出力
分岐(If-Else, Else if, Switch) ループ(While, For, Do-while)
岡村耕二 TCP通信プログラム 岡村耕二 情報ネットワーク.
Presentation transcript:

Talkプログラムのヒント 1 CS-B3 ネットワークプログラミング  &情報科学科実験I

このスライドについて このスライドでは皆さんがプログラムを書いたり,関数を調べたりする過程で行き詰ると予想される部分について簡単に解説します. このスライドの目的は自主学習のサポートであり,説明が簡略化されています.完全な理解には自主学習が必要なので注意してください.

目次 よくつまずくところ 解決方法の例 select()とは ファイルディスクリプタとは ファイルディスクリプタ 具体的な仕様 ファイルディスクリプタ 具体的な仕様 ファイルディスクリプタ 使用例 select()の引数 select()の動作 まとめ

よくつまずくところ こんなプログラムのままになっていませんか? while(1) { fgets()でキー入力を取得; キー入力しなければ send()で入力文字を送信; recv()で相手からメッセージを受け取る; } キー入力しなければ 次に進めない 送っている最中は キー入力,受信ができない 受信待ちの間は キー入力,送信ができない

解決方法の例 こんなプログラムが書けるとよいですね. while(1) { if (fgets()すべきならば) { } if (send()すべきならば) { send()で入力文字を送信; if (recv()すべきならば) { recv()で相手からメッセージを受け取る;

解決方法の例 少しだけ具体的に書くと… while(1) { select()の引数の設定; select(引数); if (FD_ISSET(標準入出力,ファイルディスクリプタの集合)) { fgets()でキー入力を取得; } if (FD_ISSET(send用ソケット,ファイルディスクリプタの集合)) { send()で入力文字を送信; if (FD_ISSET(recv用ソケット,ファイルディスクリプタの集合)) { recv()で相手からメッセージを受け取る;

select()とは ソケット,標準入出力,ファイルが読み込み可能か,書き込み可能かを調べるときに使う. あらかじめ 監視する目的 (読み込み,書き込み) 監視する対象(ソケットか,標準入力か…) Select()のタイムアウト を決めなければならない ファイルディスクリプタの知識が必要

ファイルディスクリプタとは select()が監視するもの = ファイルディスクリプタの集合の変化 ファイルディスクリプタ ソケット,標準入出力,ファイルを識別する値 socketID = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); これ 標準入出力のファイルディスクリプタ   stdin:0, stdout:1, stderr:2 ファイルディスクリプタの集合 複数のファイルディスクリプタの値をまとめて管理するもの

ファイルディスクリプタ 具体的な仕様 fd_set型変数 ファイルディスクリプタの集合 fd_set set; select()実行前

ファイルディスクリプタ 具体的な仕様 ファイルディスクリプタの集合の操作用マクロ FD_ZERO(fd_set *set); 集合をリセットする FD_SET(int fd, fd_set *set); fdを集合に登録する FD_SET(STDIN_FILENO, fd_set *set);  標準入力を集合に登録する FD_ISSET(int fd, fd_set *set); fdが集合に登録されているか確認 FD_CLR(int fd, fd_set *set); fdを集合から取り除く

ファイルディスクリプタ 登録例 ※ソケットをsoketIDとする. fd_set socketSet; ファイルディスクリプタの集合を作成 FD_ZERO(&socketSet); ファイルディスクリプタ集合の初期化 FD_SET(socketID, &socketSet); ソケットを集合に登録する FD_SET(STDIN_FILENO, &socketSet); stdinを集合に登録する 変数socketSetをselect()に渡せばソケットやstdinから文字列を受け取れるか確認できる.

select()の引数 ファイルディスクリプタの集合 ファイルディスクリプタは3種類指定できる. ファイルディスクリプタの集合(読み込み可能かどうかを調べる), ファイルディスクリプタの集合(書き込み可能かどうかを調べる), ファイルディスクリプタの集合(例外が発生したかどうかを調べる), タイムアウト); ファイルディスクリプタの集合 ファイルディスクリプタは3種類指定できる. それぞれ,読み込み可能かどうか,書き込み可能かどうか, 例外が発生したかどうかを監視するためにある. 読み込み可能かどうかを調べるためにselect()が用いられることが多い.

select()の引数 ファイルディスクリプタの最大値 + 1 ファイルディスクリプタの集合(読み込み可能かどうかを調べる), ファイルディスクリプタの集合(書き込み可能かどうかを調べる), ファイルディスクリプタの集合(例外が発生したかどうかを調べる), タイムアウト); ファイルディスクリプタの最大値 + 1 3種類のファイルディスクリプタの集合のうち,最も値の大きいファイルディスクリプタの値 例) socket1 と socket2の監視をしたい場合 socket1 > socket2 ならば socket1 + 1 socket1 < socket2 ならば socket2 + 1 タイムアウト この時間を過ぎるとselect()の待機状態は終了する. (※詳細はstruct timevalについて調べてください)

select()の動作 ファイルディスクリプタの集合に登録されたソケットや標準入力に変化があるまで待機する. FD_ISSETを用いれば,どこから文字列を受け取ればよいかわかる

Select関数を用いた並列処理の流れ fd_set socketSet FD_ZEROでsocketSetの初期化 socketID stdin FD_SETでsocketSetへの登録 socketID stdin select(socketID+1,&socketSet,NULL,NULL,&tv) 集合内のどれかが読み込み可能となるまで待機 socketIDからの読み取りが可能となった ⇒select関数は集合からsocketID以外を削除する socketID FD_ISSETでどのファイルディスクリプタが 集合内に残っているかを判別⇒各種処理

select()の動作 最初に見たプログラムの意味が分かってきた気がしませんか? while(1) { select()の引数の設定; if (FD_ISSET(標準入出力,ファイルディスクリプタの集合)) { fgets()でキー入力を取得; } if (FD_ISSET(send用ソケット,ファイルディスクリプタの集合)) { send()で入力文字を送信; if (FD_ISSET(recv用ソケット,ファイルディスクリプタの集合)) { recv()で相手からメッセージを受け取る;

select()の動作 注意(重要) ファイルディスクリプタの集合の設定はselect()を実行するたびに行ってください つまり while(1) の無限ループ内で,select()実行前に毎回 ファイルディスクリプタ集合とタイムアウトの設定を行う必要がある

まとめ select()を使うとfgets(),send(),recv()を行うべきタイミングが分かる このスライドのヒントはあくまでも実装方法の一例です. ほかにも実装方法があるかもしれません. 以上の内容をヒントにして,自主学習やプログラムの実装を進めてみてください.