ユビキタスシステムアーキテクチャ 第5回 ネットワークプログラミングの基礎

Slides:



Advertisements
Similar presentations
TCP/IP によるチャットプログラ ム 薄井 秀晃. 基礎知識編 TCP/IP とは? IP とは・・・ Internet Protocol の略称であり通信方法の技術的なルールで あり、実際にデータを送受信する前にデータを小さなデータ に分割し、それに発信元と受信先の IP アドレスを付加させて.
Advertisements

アルゴリズムとデータ構造 第2回 線形リスト(復習).
情報基礎A 情報科学研究科 徳山 豪.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
Webアプリケーションの 通信メカニズム WEBアプリ研究プロジェクト 第2回.
システムコール 低水準入力 ファイルディスクリプタ ソケット
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
データ構造とアルゴリズム 第10回 mallocとfree
ネットワークプログラミング 第7回「ネットワークとプログラミング(2)」
システムプログラミング 第13回 情報工学科 篠埜 功.
OSとコマンド OS:コンピュータを使うための基本プログラム コマンド:OS上で使用できる命令 OS本体であるカーネルの内部コマンド
第13回 プログラミングⅡ 第13回
TCP (Transmission Control Protocol)
第4回 個人の動画配信補足のためのWeb構築
OpenID 勉強会 (OpenID Authentication1.1)
30分でわかるTCP/IPの基礎 ~インターネットの標準プロトコル~ 所属: 法政大学 情報科学研究科 馬研究室 氏名: 川島友美
数値計算及び実習 第7回 プログラミングの基礎(5).
Windows Network Programming
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング システムプログラミング プロセス間通信(パイプ) 担当:青木義満
構造体.
HTTPプロトコルとJSP (1) データベース論 第3回.
HTTPプロトコル J2EE I 第7回 /
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング 第11回 プロセス間通信4 仮想FTPの実現 担当:青木義満
第5回ネットワークプログラミング 中村 修.
第10回 プログラミングⅡ 第10回
第8章 Web技術とセキュリティ   岡本 好未.
情報検索概説II(99秋) 第3回 1999/10/21 インターネットの仕組み(2).
ネットワークプログラミング 中村 修.
第11回ネットワークプログラミング 中村 修.
システムプログラミング 第13回 プロセス間通信(続き) 情報工学科 篠埜 功.
第7回ネットワークプログラミング 中村 修.
UDPエコーサーバ UDP-echoサーバのプログラムモデル(Cプログラム) サーバで利用するソケット関数(Cプログラム)
システムプログラミング 第13回 情報工学科 篠埜 功.
システムプログラミング 第12回 プロセス間通信 情報工学科 篠埜 功.
岡村耕二 トランスポート層 ソケットプログラミング 岡村耕二 情報ネットワーク.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第2回 ファイル処理 情報・知能工学系 山本一公
プログラミング 4 記憶の割り付け.
ネットワークの基礎知識 電子制御設計製図Ⅰ   2014年5月2日 Ⅲ限目.
TCP/IP入門          櫻井美帆          蟻川朋未          服部力三.
第7回 プログラミングⅡ 第7回
第11回 プログラミングⅡ 第11回
Webプロキシ HTTP1.0 ヒント CS-B3 ネットワークプログラミング  &情報科学科実験I.
P n ポインタの基礎 5 q m 5 7 int* p; int 型の変数を指すポインタ int* q; int 型の変数を指すポインタ int n=5, m=7; int 型の変数 int array[3]; int* pArray[3]; p = &n; ポインタにアドレスを代入しているのでOK.
TCP/IPとプロセス間通信 2007年1月12日 海谷 治彦.
Talkプログラムのヒント 1 CS-B3 ネットワークプログラミング  &情報科学科実験I.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
岡村耕二 トランスポート層 岡村耕二 情報ネットワーク.
最低限インターネット ネットワークにつなぎましょ!
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
C言語 はじめに 2016年 吉田研究室.
プログラミング演習I 2003年7月2日(第11回) 木村巌.
Webアプリケーションと JSPの基本 ソフトウェア特論 第4回.
システムプログラミング 第12回 プロセス間通信 情報工学科 篠埜 功.
システムプログラミング 第12回 プロセス間通信 情報工学科 篠埜 功.
ネットワーク・プログラミング Cプログラミングの基礎.
システムプログラミング 第10回 プロセス間通信3 簡易Web server(準備) Chat プログラム 担当:青木義満、篠埜 功
岡村耕二 TCP通信プログラム 岡村耕二 情報ネットワーク.
ネットワークプロトコル.
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング 第11回 プロセス間通信4 仮想FTPの実現 担当:青木義満
ネットワーク・プログラミング TCPサーバ.
ネットワーク・プログラミング 1対多のプロセス間通信.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
モバイルプログラミング第2回 C言語の基礎 (1).
アプリケーションゲートウェイ実験 2001.10.5 鬼塚 優.
プログラミング演習II 2003年12月10日(第7回) 木村巌.
TCP/IPの通信手順 (tcpdump)
ポートスキャン実習 2002年9月19日 修士1年 兼子 譲 牧之内研究室「インターネット実習」Webページ
岡村耕二 TCP通信プログラム 岡村耕二 情報ネットワーク.
HTTPプロトコルの詳細 M1 峯 肇史.
Presentation transcript:

ユビキタスシステムアーキテクチャ 第5回 ネットワークプログラミングの基礎 ユビキタスシステムアーキテクチャ 第5回 ネットワークプログラミングの基礎

本日の概要 C言語基礎の積み残し 構造体 ポインタ ネットワークの基礎知識 socket の概念 echo サーバ,クライアント 今日の宿題

今までの復習 データ型 関数 if else 文 for 文 while 文 配列

いろいろなデータを扱う(構造体) 複数のデータ型を組み合わせて、新しく作るデータ型 struct grade{ int id; char name[20]; double avg; }; struct タグ名 {   データ型 メンバ名; };

構造体 struct.c を実行してみる 構造体の宣言 struct タグ名 変数名の並び; struct grade student1;

構造体 cont. 構造体の初期化 構造体変数の初期化 { } の間に、メンバ名をカンマで区切る { } の間に、メンバ名をカンマで区切る  { } の間に、メンバ名をカンマで区切る       struct grade student1 = {4, "TANAKA", 80.5}; { } の間に、メンバ名をカンマで区切る     struct grade student2[20] = {{1, "SUZUKI", 68.1 },       {2, "SAITO", 59.2 }, {3, "NAKATA", 48.4 }, };

構造体 cont. 構造体の参照 構造体変数名. メンバ名 printf("%d %s %5.1f\n\n",  構造体変数名. メンバ名 printf("%d %s %5.1f\n\n", student1.id, student1.name,student1.avg); printf("%d %s %5.1f\n", student2[i].id, student2[i].name, student2[i].avg); student1.id = 5; sutdent1.name = “HOGE”; のように使用できる

構造体演習問題 新たにstruct2.c というファイルを作成し、以下の処理を行なってください。 以下の表を構造体で表し、平均点を求めてく 番号 国語 数学 化学 英語 平均点 1111 69 50 70 96 71.25 2222 98 39 60 60 64.25 3333 89 78 88 90 86.25 4444 40 50 98 60 62.00 5555 63 60 89 95 76.75

構造体データ {{ 1111, 69, 50, 70, 96, 0.0 }, { 2222, 98, 39, 60, 60, 0.0 }, { 3333, 89, 78, 88, 90, 0.0 }, { 4444, 40, 50, 98, 60, 0.0 }, { 5555, 63, 60, 89, 95, 0.0 },};

ポインタ 「データのメモリ番地」のこと. int, char, short, struct など,全てのデータは,「メモリ」上に領域が確保されます. 注:厳密にはこのメモリ番地は間違っています.説明のため簡単に書いています. 例) int i = 0; char c = ‘a’; struct hoge { int j = 3; char c[4]; } hoge1; 0x0000000d j = 3 c[4] 0x00000005 c = ‘a’ 0x00000004 i = 0 0x00000000 メモリ番地

* と & メモリ番地を格納しておく変数のことを,「ポインタ変数」と言います. 「*」を変数の前につけることで,ポインタ変数になります. int *p; 「*」を変数の前につけることで,ポインタ変数になります. int のデータが格納されたメモリ番地なのか,char 用なのかを判別するため,int *p のように,記述する. 変数自体のポインタ(メモリ番地)を取得するときには,変数に & をつける. int i; &i; ←ポインタを表す ポインタ変数に * をつけると,メモリ番地の中身(実体)を示します. int I = 0; int *p = &I; *p は?  → 0 が返ってきます.

配列とポインタ 配列は,メモリ番地を順番に確保している. I[9] 0x00000024 I[8] 0x00000020 I[7] 0x0000001c I[6] 0x00000018 I[5] ex) int i[10]; &i[0] → 0x00000000 int *p; p = &I[0]; p++; → 0x00000004; p++; → 0x00000008; 0x00000014 I[4] 0x00000010 I[3] 0x0000000c I[2] 0x00000008 I[1] 0x00000004 I[0] 0x00000000

プログラムを眺めてみよう http://www.ht.sfc.keio.ac.jp/usa2007s/ から,usa05.zip をダウンロードして,中に入っている,pointer.c をコンパイルしてください. Cygwin のターミナル でのコマンド % unzip usa05.zip % cd usa05 % gcc pointer.c % ./a.exe pointer.c から抜粋 int i; int *int_p; /* int 型のポインタ変数宣言*/ i = 7; int_p = &i; printf("i is %d, i's pointer is %p¥n", i, int_p); printf("*int_p is %d¥n", *int_p);

本日の概要 C言語基礎の積み残し 構造体 ポインタ ネットワークの基礎知識 socket の概念 echo サーバ,クライアント 今日の宿題

様々な通信モデル クライアントサーバ型 P2P 型 アドホック型

クライアントサーバ型 現在最も多く利用されているネットワークの形態. Web,メール,メッセンジャーなどなど サービスを提供するサーバーと,サービスを受けるクライアントから構成される. http://www.google.com/ を要求. Web サーバー が返ってくる.

P2P型 定まったクライアントやサーバが存在せず,ネットワーク上の他のコンピュータに対して,サーバとしてもクライアントとしても動作するようなコンピュータの集合によって形成されるネットワークのこと. ex) skype, winny, BitTorrent など

アドホック型 無線接続できる端末のみで構成されたネットワーク.既存のインフラが必要ないのが特徴. 狭義の P2P ネットワークとも言える.

IP アドレスとポート番号 IPアドレス:インターネットを構築する時,個々のマシンに一意に割り当てられる識別子のこと. 現在主流の IPv4 では,32 bit で表現される. ex) www.sfc.keio.ac.jp -> 133.27.4.127 “nslookup” というコマンドで確認できます. % nslookup www.sfc.keio.ac.jp ポート番号:一つのコンピュータ上で動作している複数のプログラムを識別するための番号. ex) HTTP: 80 番, SSH: 23 番 “netstat -a” というコマンドで確認できます.

OSI 参照モデル コンピュータ同士が通信する際の,通信機能を階層構造に分割したモデルのこと. アプリケーション層 プレゼンテーション層 具体的な通信サービスを提供(HTTP, SMTP) プレゼンテーション層 データの表現方法(SMTP, SNMP,FTP) セッション層 通信プログラム間の通信の開始から終了までの手順(NetBIOS, Named Pipe) トランスポート層 ネットワークの端から端までの通信管理(TCP,UDP,NetBEUI) ネットワーク層 ネットワークにおいて通信経路の選択.(IP, IPv6,ARP,ICMP) データリンク層 直接的に接続されている通信機器間の信号の受け渡し(Ethernet, token ring, PPP) 物理層 物理的な接続のこと.(RS-232, UTP,FTTH, 802.11abgn) アプリケーション層 プレゼンテーション層 セッション層 トランスポート層 ネットワーク層 データリンク層 物理層

TCPとUDP ネットワーク通信を行う際,エンドホスト間でよく使われる通信プロトコル. TCP/UDP 133.27.23.11 66.249.89.147(google) ルーターA (a.b.c.d) ルーターB (e.f.g.h) TCP(Transmission Control Protocol): 信頼性のあるデータ転送を作成したいときに利用する. パケットシーケンスチェック,パケット再送機能など. オーバヘッドが多いため比較的低速. UDP(User Datagram Protocol): 信頼性が必要ない場合に利用される. ビデオストリーミング,VoIP など 送信するのみなので,比較的高速.

本日の演習では クライアントサーバ型プログラミング TCP

本日の概要 C言語基礎の積み残し 構造体 ポインタ ネットワークの基礎知識 socket の概念 echo サーバ,クライアント 今日の宿題

socket って? プログラムが別のプログラムと通信を行うためのインターフェース ファイルと同じように扱える コンピュータの識別番号(IPアドレス)と,プログラムの識別番号(port番号)を指定 別のプログラムは同じPCで動いていても良いし,別のPCで動いていても良い ファイルと同じように扱える UNIXでは読み書きできるものをファイルとして扱う キーボード,画面,プリンタ・・・ UNIX端末の/dev以下 ただし,ネットワークは開始の時だけ少し複雑

本日の概要 C言語基礎の積み残し 構造体 ポインタ ネットワークの基礎知識 socket の概念 echo サーバ,クライアント 今日の宿題

echo サーバを作成しよう echo サーバって? ただ文字列を返すだけのもの 7000番ポート abc abc echo サーバ

演習の準備 usa05.zip 内の,echo_server.c を編集できる状態にしてください. “HERE” と書いてある場所があるので,そこを埋めていくことで,echo サーバを作成します.

ネットワークの抽象化 ネットワークプログラミングにおいては、データ通信の端点をソケットとして抽象化している ソケットはファイルと同じように扱える ファイル プロセス ネットワーク 全て同様の手法でデータ通信が可能

通信(サーバの場合) 手順 ソケットを作る(socket) ソケットを初期化(bind) 接続待ち(listen) 接続確立(accept) 通信する(read、write) ソケット切断(close)

ソケットを作る socket関数を使う 使い方 #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol); 成功するとファイルディスクリプタが返る このファイルディスクリプタに対して,読み書き(read/write)を行うことで,相手と通信する. ただし、読み書きできるようになるには通信先との接続が完了してから 使い方 sockfd = socket(PF_INET, SOCK_STREAM, 0); SOCK_STREAM: TCP SOCK_DGRAM: UDP

ソケットを初期化 bind関数を用いる int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen); ソケットにポート番号等を結びつける sockaddr_in 構造体 アドレス体系,ポート番号,受け付けるIPアドレスなどを記述する. 使い方 struct sockaddr_in server; memset((void *)&server, 0, sizeof(server)); server.sin_family = PF_INET; server.sin_port = htons(7000); server.sin_addr.s_addr = htonl(INADDR_ANY); bind(sockfd, (struct sockaddr *)&server, sizeof(struct sockaddr_in));

接続待ち listen関数を用いる int listen(int sockfd, int backlog); 使い方 接続を待つ 使い方 listen(sockfd, 5);

接続確立 accept関数を使う 使い方 接続を受ける int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); 接続を受ける 使い方 len = sizeof(client); acceptfd = accept(sockfd, (struct sockaddr*)&client, &len);

通信 通信が確立したら、以降はファイルと同じように扱える read 関数 write 関数 通信が終了したらcloseで接続を切断しよう int read(int sockfd, void *buf, int size); 使い方 read(acceptfd, buf, sizeof(buf)); write 関数 int write(int sockfd, void *buf, int size); write(acceptfd, buf, strlen(buf)); 通信が終了したらcloseで接続を切断しよう close(acceptfd); close(sockfd);

echo サーバを立ち上げてみよう % gcc echo_server.c % ./a.out クライアントは,telnet で代用できます. % telnet localhost <port 番号> ex) % telnet localhost 7000 (自分のマシン上でサーバを立ち上げていて,ポート番号が 7000 番の場合)

本日の概要 C言語基礎の積み残し ネットワークの基礎知識 socket の概念 file の扱い方 echo サーバ,クライアント 構造体 ポインタ ネットワークの基礎知識 socket の概念 file の扱い方 echo サーバ,クライアント 今日の宿題

今日の宿題 1,2年生向け(ネットワークプログラミングに不慣れな人向け) 3,4年生向け(ネットワークプログラミング経験のある人向け) 期限 echo サーバを改良して,打った文字が逆になって返ってくる,reverse サーバを作成しよう. ex) “abc” と送ると,”cba” と返ってくる. 3,4年生向け(ネットワークプログラミング経験のある人向け) echo サーバを改良して,簡単な web サーバを作成してみよう. ヒント:ファイル操作ができる必要があります. 補足のスライドを参考に,作ってみてください. 期限 5/23, 23:59 まで. web の課題提出フォームから提出してください.

タームプロジェクトについて 中間発表 チーム分け 6/7 に中間発表です. どのようなものをこの授業で作成するかについて,3〜5分程度で発表.可能ならば簡単な設計まで示してください. チーム分け まだチームを作成していない人は,早急に web から登録してください. どうしてもチームを作成できない場合は5/18(金)までに学年,氏名を添えてその旨を usa2007s@ht.sfc.keio.ac.jp へ.

補足 file の扱い方 簡単な web サーバを作ってみよう(3, 4年生向け)

UNIXにおけるファイル ファイルって何だろう? ファイルに対して行える事 コンピュータ上でのデータ(ビットの集合)に名前を付けたもの 狭義では、ファイルシステムにより管理されたハードディスク上の一塊のデータ ファイルに対して行える事 読み取り(read) 書き込み(write) etc UNIX系OSでは、コンピュータ上の様々なモノとのデータのやり取りをファイル操作として抽象化している つまり、色々なデータ通信をreadとwriteで行う事ができる!

ファイル操作 手順 ファイルを開く(open) ファイルを操作する(read、write) ファイルを閉じる(close)

ファイルを開いてみよう ファイルを開くにはopenシステムコールを使う 使い方 int open(const char* pathname, int flags); 成功すると、pathnameで指定されたファイルのファイルディスクリプタ(ファイルを識別する数字)を返す 失敗(ファイルが存在しない等)すると-1が返る 返ってきたファイルディスクリプタに対し、readやwrite等のファイル操作が行える 使い方 int fd = open(“hoge.txt”, O_RDONLY); fdという変数にhoge.txtというファイルのファイルディスクリプタが入る

ファイルの中身を読み込んでみよう ファイルを読み込むにはreadシステムコールを使う 使い方 char buf[1024]; ssize_t read(int fd, void* buf, size_t count); 成功すると、fdで指定されたファイルのデータをcountバイトbufに読み込み、実際に読み込んだバイト数を返す 失敗すると-1を返す 常にcountバイト読み込めるとは限らない 使い方 char buf[1024]; read(fd, buf, sizeof(buf)); bufに1024バイト分ファイルのデータを読み込む

ファイルにデータを書き込んでみよう ファイルに書き込むにはwriteシステムコールを使う ssize_t write(int fd, const void *buf, size_t count); 成功すると、fdで指定されたファイルに対し、countバイトbufを書き込み、実際に書き込んだバイト数を返す 失敗すると-1を返す 常にcountバイト書き込めるとは限らない

ファイルを閉じる 使い終わったファイルは必ず閉じよう ファイルを閉じるにはcloseシステムコールを使います int close(int fd); 成功した場合は0を返す 失敗したら-1を返す

ファイルの内容を表示するプログラム } int fd; //ファイルディスクリプタ char buf[1024]; //ファイルのデータ #include <stdio.h> #include <unistd.h> void main() { int fd; //ファイルディスクリプタ char buf[1024]; //ファイルのデータ //ファイルを読み込む fd = open(“hoge.txt”, O_RDONLY); read(fd, buf, 1024); close(fd); //ファイルを表示 write(1, buf, strlen(buf)); //ファイルディスクリプタ1は標準出力に割り当てられている }

補足 file の扱い方 簡単な web サーバを作ってみよう(3, 4年生向け)

作るもの Webサーバ 主なWebサーバ Webブラウザからのリクエストを受け付け、指定されたデータを渡すソフトウェア Apache(UNIX系) IIS(Windows系)

Web上でのデータ転送 HTTPというプロトコルを用いてデータを転送する HTTPは要求-応答型プロトコル このプロトコルに準拠していれば、自分でサーバやブラウザを作成する事も可能 HTTPは要求-応答型プロトコル ブラウザはサーバに対してリクエストを出す サーバはブラウザからのリクエストに応じてデータを転送する

Web上でのデータ転送のイメージ

HTTP(Hypertext Transfer Protocol) Webサーバとブラウザ間のデータのやり取りを規定した通信プロトコル RFC 2616で定義されている 主にHTMLの転送を目的とする バイナリデータの転送も可能 HTML(HyperText Markup Language) Web上のドキュメントを表現するための言語

HTTPリクエスト(バージョン1.1の場合) GET / HTTP/1.1 Host: localhost:10080 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.3) Gecko/20070 309 Firefox/2.0.0.3 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plai n;q=0.8,image/png,*/*;q=0.5 Accept-Language: ja,en-us;q=0.7,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive

HTTPレスポンス(バージョン1.1の場合) HTTP/1.1 200 OK Date: Tue, 11 May 1999 10:27:51 GMT Server: Apache/1.3.0 (Unix) Vary: accept-language Last-Modified: Thu, 08 Apr 1999 04:17:21 GMT ETag: "8a0c3-cd6-370c2dd1“ Accept-Ranges: bytes Content-Length: 3286 Keep-Alive: timeout=15, max=100 Connection: Keep-Alive Content-Type: text/html Content-Language: en <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> この後データが続く…

HTTPリクエスト(バージョン0.9の場合) GET / 1行だけで済む レスポンスもデータをそのまま返すだけ 今回は0.9で実装します

GETリクエスト GET <ファイル名> 例: GET / 指定されたファイルのデータをクライアントに送り返す “GET /” は大抵”GET /index.html”と解釈される 指定されたファイルのデータをクライアントに送り返す

作り方 授業中に完成させた,echo_server.c を改造してみましょう. GET / という文字列が来たら,index.html を読み込んで,その内容を acceptfd に書く. index.html は,自分で作成してください. もうちょっと作ってみたいなら GET /hoge.html という文字列の場合は hoge.html を返す,など,ファイル名の部分をパースしてみましょう. 存在しないファイル名が要求されたら,Not Found と返すようにしてみましょう.

Webサーバの動作手順 Webブラウザからの接続要求を待つ ブラウザと接続したら、リクエストを受け取る リクエストを解析する 要求されたファイルを開く ファイルのデータをメモリ上に読み込む データをブラウザに送信する ブラウザとの接続を切断する 1に戻る