Microsoft PowerPoint pptx

Similar documents
情報ネットワーク演習 2007 年 10 月 11 日 ( 木 )

情報ネットワーク演習 2006年10月5日

BSDソケットによるIPv6プログラミングを紐解く

memo

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

PowerPoint プレゼンテーション

Microsoft PowerPoint - 09.pptx

Taro-ポインタ変数Ⅰ(公開版).j

Microsoft Word - Cプログラミング演習(12)

情報処理 Ⅱ 2007 年 11 月 26 日 ( 月 )

プログラミングI第10回

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

Microsoft PowerPoint - 5Chap15.ppt

模擬試験問題(第1章~第3章)

02: 変数と標準入出力

Microsoft PowerPoint pptx[読み取り専用]

AsteriskのIPv6対応について

プログラミング及び演習 第1回 講義概容・実行制御

Microsoft Word - 第5回 基本データ構造2(連結リスト).doc

Microsoft PowerPoint - lec10.ppt

情報通信の基礎

Microsoft PowerPoint - CproNt02.ppt [互換モード]

Microsoft Word - Cプログラミング演習(11)

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){

第1回 プログラミング演習3 センサーアプリケーション

Microsoft PowerPoint ppt

PowerPoint Presentation

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

PowerPoint Template

02: 変数と標準入出力

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

Microsoft Word - no15.docx

02: 変数と標準入出力

C言語講座 ~ファイル入出力編~

PowerPoint プレゼンテーション

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

プログラミング基礎

学生実験 3 日目 DNS IP ネットワークアーキテクチャ 江崎研究室

データ構造

Taro-ファイル処理(公開版).jtd

プログラミング基礎

ファイル入出力

Transcription:

情報ネットワーク演習 2009 年 10 月 8 日 ( 木 )

本日の内容 課題 5 HTTPクライアントハイパーテキストへのアクセス 課題 4 HTTP サーバのビルド 課題 3 ソケットを用いたプロセス間通信 課題 1 低水準入出力 課題 2 名前解決 ( ホスト名 IPアドレス ) 2

第 2 回課題 実施内容と意図 IPアドレスとホスト名の相互変換をするプログラムを拡張する. この課題を通じて,IPv4における名前解決の方法, および関連するライブラリルーチンや構造体の仕様を学ぶ. 3

ホスト名とは 例 nachi00 nachi00.sys.wakayama wakayama-u.ac.jp www.wakayama-u.ac.jp www.google.co.jp localhost 書式 英数字等を. でつなぐ. 人間にとって見やすい. 演習室内ではこれらは同じ計算機 ( ホスト, ノード ) を指す FQDN (Fully Qualified Domain Name) と呼ばれる 4

IP アドレスとは ( 文字列 ) 例 133.42.159.1 66.249.89.104 127.0.0.1 書式 32 ビット 0~255 の整数を 4 つ書き,. でつなぐ. ドット付き10 進記法 (dotted decimal notation) ともいう. 人間にとって見やすい. 5

IP アドレス ( バイナリ ) 例 10000110 00101010 10011111 00000001 文字列による IP アドレスを 4 オクテット (4 バイト ) で表現し, 順番に ( ネットワークバイトオーダ, またはビッグエンディアン ) メモリに格納する. 計算機が処理するのに適している. 6

IP アドレスとホスト名を知るコマンド host Vine Linux でも利用可 host nachi00 host 133.42.159.1 host www.google.co.jp nslookup 古いコマンド. 最近の Linux では非推奨 7

DNS (Domain Name System) インターネットにおけるホスト名と IP アドレスとを対応させるシステム ホスト名 IP アドレスを 正引き, IPアドレス ホスト名を 逆引き という. DNS サーバ に リゾルバ (resolver) が問い合わせて情報を得る. DNSサーバ間で情報交換をすることも 演習室環境で, 通信する DNS サーバを知りたければ cat /etc/resolv.conf ソフトウェアでは BIND (Berkeley Internet Name Domain) が有名 8

ホスト名と IP アドレスは多対多 多対多 は二つの 一対多 に分ける 一つのホスト名に複数の IP アドレス ホスト名と IP アドレスは一対多 www.l.google.com www.google.com www.google.co.jp mail.sys.wakayama-u.ac.jp 66.249.89.99 66.249.89.103 66.249.89.104 66.249.89.147 ntp.sys.wakayama-u.ac.jp 133.42.159.1 ns.sys.wakayama-u.ac.jp dns.sys.wakayama-u.ac.jp 一つの IP アドレスに複数のホスト名 IP アドレスとホスト名は一対多 9

ホスト名と IP アドレスの変換の使い道 実用上は ホスト名から IP アドレスの一つ, IP アドレスからホスト名の一つ ( 正式なホスト名 ) を求めれば十分 利用例は クライアント : サーバのホスト名 IP アドレス サーバ : 例えばアクセスをログに記録する際, クライアントのIPアドレス ホスト名 10

IPv4 と IPv6 本演習では,IPv4 のみを対象とする. IPv4 アドレス長 :32 ビット ( アドレス空間 :2 32 ) IPv6 アドレス長 : 128 ビット ( アドレス空間 : 2 128 ) IPアドレスは. ではなく : で区切って表記する. 省略記法もある. IPv6 に移行しても, ホスト名は変わらない 11

相互変換プログラムを C で書くには 数個のライブラリルーチンと構造体を理解すること ライブラリルーチン : getaddrinfo, getnameinfo, freeaddrinfo 構造体 : struct addrinfo DNSサーバへ直接通信する処理は不要 ( ライブラリルーチンに任せる ) 12

getaddrinfo ライブラリルーチン int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res); ソケットアドレス構造体を生成する. node は, ホスト名 または 文字列形式の IP アドレス. serviceは, サービス名もしくはポート番号の文字列. 今回はNULL にする. hints に, ヒント情報を格納して呼び出す ( ポインタ渡し ). res はソケットアドレスのリストのポインタのポインタ. あらかじめ struct addrinfo * 型のポインタ変数を確保した上で & 変数 と書く ( ポインタ渡し ). 13

addrinfo 構造体 struct t は不可欠 ( struct t addrinfo 型 を宣言している ) struct addrinfo { int ai_flags; /* フラグ */ int ai_family; /* プロトコルファミリ */ int ai_socktype; /* TCP, UDPの別 */ int ai_protocol; /* プロトコル詳細 */ size_t ai_addrlen; /* ai_addrのバイト数 */ struct sockaddr *ai_addr; /* IPアドレス ( バイナリ ) */ char *ai_canonname; /* ホスト名文字列 */ struct addrinfo *ai_next; /* 次へのリンク */ }; 戻り値 ( 線形リスト )... ai_addr: 133042159002... ai_next: 実際にはバイナリ形式... ai_ addr: 133042160002... ai_next: NULL 適切なホスト名が格納されている保証はない 14

getnameinfo ライブラリルーチン int getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host, size_t hostlen, char *serv, size_t servlen, int flags); アドレスから名前へ変換する. sa は IP アドレス ( バイナリ ),salenl はその長さ. addrinfo 構造体の ai_addr, ai_addrlen に対応する. host に結果が格納される. 配列などにより, あらかじめ領域を確保しておく.hostlenはその長さを指定する. serv と servlen は,host と hostlen と同様. 今回は使用しないので,NULL と 0 を指定する. flags が 0 なら, ホスト名を得る ( 時間がかかることも ). flags を NI_NUMERICHOST とすると 自習すること. 15

再入可能性 IP アドレスから文字列を得るライブラリルーチン inet_ntoa は, 再入可能でない. 配列領域を別のところで ( 静的領域などに ) 確保しており, そのアドレスを返す. 連続して呼び出すと, 前の結果は上書きされる. getaddrinfo,getnameinfo は, 再入可能である. 連続して呼び出しても, 問題ない. 戻り値の領域を, 呼び出し側で確保しておき, 引数に与える. ポインタ渡し ( 参照渡し ) になる. getaddrinfo の処理で,malloc などによりソケットアドレス構造体が作られる. 開放するには,(freeではなく) freeaddrinfo を呼び出す. 16

そもそもなぜgetaddrinfo,getnameifo g か? IPアドレスとホスト名の相互変換プログラムを書く古典的な方法は,gethostbyname,gethostbyaddrといったライブラリ関数を使用することである. これは, IPv4にしか対応してしておらず, また再入可能でない ( 連続して呼び出せない ) といった問題があった. getaddrinfoは, 再入の問題がないだけでなく, IPv4/IPv6の両方に対応する. さらに, 第 3 回課題のサーバプログラムがすっきり記述できるようになる. 17

課題 2(1) ~takehiko/network-enshu2009/2/resolver.c は, ホスト名またはIPアドレスを引数にとり, そのIPアドレスとホスト名のペア ( 複数あっても一組だけ ) を出力するプログラムである. ( コンパイルして resolver を作る )./resolver nachi00.sys.wakayama-u.ac.jp 133.42.125.50 125 50 (nachi00.sys.wakayama-u.ac.jp)./resolver www.google.com 66.249.89.104 (nrt04s01-in-f104.google.com) host www.google.com... 結果は各自確認のこと 18

課題 2(2) ~takehiko/network-enshu2009/2/resolver.censhu2009/2/resolver をコピーして ~/network-enshu2009/2/resolver.c とし, 以下の仕様を満たすよう, 修正をしなさい. ホスト名が複数の IP アドレスに結び付けられているとき, IP アドレス ( のビット列 ) に関して昇順で出力する. 見つかった IP アドレスが 0 個または 1 個のときは, 修正前と同じ出力とする. ファイル先頭のコメント ( 作成者, 作成日時 ) を変更し, 末尾に作業メモを残す. ディレクトリのパーミッションは 705, ファイルは 604 にしておくこと. 19

課題 2(3) プログラムが完成したと思ったら, ~takehiko/network-enshu2009/2/command?? の各コマンドを実行し, 妥当な出力になることを確かめること. さらに, 以下のコマンドを実行するとよい. ~takehiko/network-enshu2009/bin/validator1 t k h / t ~takehiko/network-enshu2009/bin/validator2 20

期限 2009 年 10 月 8 日 ( 金 )19:30 の回収までに完成させておくこと. 期限後のプログラム修正は? 最終的な回収までの修正 ( コメントの充実, デバッグなど ) は OK. 21

線形リストのソート方法 (1) 初期状態 HEAD key: 4 next: key: 2 next: key: 1 next: key: 3 next: NULL 22

線形リストのソート方法 (2) ポインタの配列を確保し, 順に代入 HEAD key: 4 next: key: 2 next: key: 1 next: key: 3 next: NULL 線形リストを1 回走査して要素数 ( この例では4) を求めてから, 配列領域を malloc で確保し, 用意しておいた ( リストの要素のポインタのポインタとなる ) 変数に代入する. ポインタの配列には, 線形リストの各要素へのリンクを順に代入する ( 既存のに基づき, 同じ箇所を指し示す ). 23

線形リストのソート方法 (3) ポインタの配列をソート HEAD key: 4 next: key: 2 next: key: 1 next: key: 3 next: NULL ソートのためのキーは, 指し示す先の ( 構造体の ) メンバ key の値. このソートでは, 構造体の値を含め, の値は一切変わらない. の値 ( 指し示す先 ) が変わる. 今回の課題では, 要素数が多くならないので, バブルソートなどを直接書いてもよいが, ライブラリ関数の qsort と memcmpを組み合わせると簡潔に書ける. 24

線形リストのソート方法 (4) ポインタの配列の順に, リンクを付け替え HEAD key: 4 next: NULL key: 2 next: key: 1 next: key: 3 next: この付け替えでは, リスト各要素のメンバnextの値 ( 次を指し示す矢印 ) が変わる. 以上の処理により, リストの各要素 ( 構造体 ) のコピーや交換をすることなく, 以下と同じ内容のデータ構造が得られた ( 線形リストをソートした ) ことになる. HEAD key: 1 key: 2 key: 3 next: next: next: key: 4 next: NULL 25