420 likes | 564 Views
Windows Network Programming. 中京大学 情報理工学部 情報システム工学科 H 107002 秋田大輔. 目次. ネットワークとプロトコル Winsock 課題. プロトコルとは. ネットワークで通信を行うときの約束事 コンピュータ同士が正しく通信するために必要 例:電話のプロトコル 自分側 相手側. 受話器を取り、相手の番号をダイヤル. 受話器のベルが鳴る. 呼び出し音がとまる. 受話器を取る. 通話. 受話器を置く. 受話器を置く. OSI基本参照モデル. データリンク層・物理層. 物理層
E N D
Windows Network Programming 中京大学 情報理工学部 情報システム工学科 H107002 秋田大輔
目次 • ネットワークとプロトコル • Winsock • 課題
プロトコルとは • ネットワークで通信を行うときの約束事 コンピュータ同士が正しく通信するために必要 例:電話のプロトコル 自分側相手側 受話器を取り、相手の番号をダイヤル 受話器のベルが鳴る 呼び出し音がとまる 受話器を取る 通話 受話器を置く 受話器を置く
データリンク層・物理層 • 物理層 • デジタルデータを電圧に変換し、機器へ送る • データリンク層 • ネットワーク上で繋がれた機器同士の通信方式を定める • 電気信号の誤り訂正や、再送信要求、フレームの判別などを行う
ネットワーク層 • 経路の選択、宛先の管理 • 実際にパケットを送るのはココ • 同じネットワークだけでなく、異なるネットワーク媒体上に接続されているコンピュータ間でも通信を行えるようにする • ⇒IP(Internet Protocol) • ネットワークに参加している機器のアドレス付や経路選択を行うプロトコル。
IPアドレス • 通信を行う際に、宛先を判別するために使う • MACアドレス(物理アドレス) • Ethernetにある固有番号 • カード間での送受信はこれを用いる
IPに関するプロトコル • ARP(Address Resolution Protocol) • IPアドレスからMACアドレスを求めるプロトコル • ⇔RAPR(Reserve ARP) • ICMP(Internet Control Message Protocol) • IPのエラー・制御メッセージを転送する • エラー通知や診断などの問い合わせ
IPアドレスについて • IPアドレスはIPv4プロトコルに基づく32bitのアドレス空間 しかし、最近IPアドレスの枯渇問題が浮上している • ネットワーク部+ホスト部で構成されている • A~Eの5つのアドレスクラスに分けられている • 10101100.00010000.11111110.00000001 172 . 16 . 254 . 1
IPアドレスのクラス • Aクラス • ネットワーク部8bit、ホスト部24bit • 0-から始まる • Bクラス • ネットワーク部16bit、ホスト部24bit • 10-から始まる 0 2^24=1600万 1 0 2^16=65536
Cクラス • ネットワーク部24bit、ホスト部8bit • 110-で始まる • Dクラス • ネットワーク部32bit、ホスト部0bit • IPマルチキャスト専用 • ホストアドレスは無い 1 1 0 2^8=256 1 1 1 0
クラスE • 将来のために予約されている • 1111-で始まる • IPアドレスの例外 • ホストアドレスが全て1 • ⇒ブロードキャストアドレスとして使われる • ホストアドレスが全て0 • ⇒IPアドレスがわからない時に使われる • この二つはホストアドレスとして使えない
サブネットマスク • IPアドレスのうち、何bitをネットワークアドレスに割り振るかを定義する32bitの数値。 • 例えばサブネットマスクが2進数で 11111111111111111111111100000000 ならば、IPアドレスのうち上位24ビットがネットワークアドレス、下位8ビットがホストアドレスである
サブネットワーク • ネットワークをサブネットマスクによって細かく分けた内の1つのネットワーク
トランスポート層 • 通信を行うプログラム間で使用する仮想的な回線の提供 • 通信相手にデータが確実に届いたかどうかの確認、再送信などの処理 データを確実に相手に届ける役割を担う
TCPとUDPの違い • TCP(Transmission Control Protocol) • コネクション型通信 • 相手との接続を確立したかどうかを確認してから通信を行う • 届かなければ再送信を自動で行う • 低速だが、データ転送の信頼性を確保している
TCPとUDPの違い • UDP(User Datagram Protocol) • コネクションレス型通信 • 相手との通信を確立せずに通信を開始 • データが抜け落ちても再送は行わない • 使用例 • skype、ストリーム形式での配信など 確実にデータが届くという保証はないが高速
セション層 • セション(仮想的な回線の開始~終了間)の管理を行い、送受信の同期をとる機能を提供する • 効率的にデータを送るための送信方法を決める、経路の確立・解放も(実際に行うのはトランスポート層)
送信方法の例 • 回線交換方式 • 回線を設定し、占有して通信を行う A B 交換局 中継局 交換局 常に一定の帯域幅が保証されるが、相応のコストがかかる
パケット交換方式 • データをパケット(小さなデータ)に分割して通信を行う • 一部で障害が発生しても、経路変更が可能 • あらかじめ回路を確立しておく必要がないため • 回路交換方式に比べてネットワークを有効に利用できるのでコスト的に有利になる可能性が高い A B
プレゼンテーション層 • ネットワーク上のアプリケーション間で意味を統一するため、文字コードなどのデータの表現形式を規定変換する • コンピュータによって対応する表現形式が違うため • データの暗号化や圧縮などを行う機能を提供する
アプリケーション層 • ネットワークを使ったサービスを他の人やプログラムに提供する • メッセージの転送、Webへのアクセス手順など用途に応じて様々なプロトコルがある
ちょっと休憩 • ゼミのノートPCを、ネットに接続する方法は? この機会に是非覚えておこう!!
接続方法 • 1.コマンドプロンプトを起動 • 2.telnet 10.0.255.254 259 • うまくいかない場合 • ipconfig/release でIPアドレスを解放 • IPアドレスが重なっている場合があるため • ipconfig/renew • IPアドレスをDHCPで更新 • 3.選択肢に1 • 4.学籍番号とパスワードを入力
DHCPって? • Dynamic Host Configuration Protocol • インターネットに接続するコンピュータに IPアドレスなどの情報を自動で割り当てる • 通信が終わると回収される • 利用者にとっては使いやすく • 管理者にとっては管理しやすく
コマンドプロンプトで用いるネットワーク系統の命令コマンドプロンプトで用いるネットワーク系統の命令 • ipconfig • TCP/IPに関する設定情報の表示 • ネットワーク構成の確認 • ipconfig(-all)だとより詳細に表示される • netstat • TCP/IPにおけるネットワークの通信状況を確認 • netstat –a • 有効なコネクションと、接続できるポートを全て表示する • netstat –e • イーサネット上にあるインタフェース情報を表示する • アクセス制御はCSMA/CDが使われる • netstat –n • IP アドレスとポート番号を名前ではなく数字で表す
WinSock • WindowsでTCP/IPの機能を備えたソフトウェアを開発するために用いるAPI Windows でネットワークを利用した 通信を行うプログラムが書ける
プログラムを組んでみよう • 今回はC言語を用いる • 『サーバ側』・『クライアント側』で二つのプログラムが必要 • サーバプログラムのホスト名 or IPアドレスを、クライアントプログラムでわかるようにする必要がある #inlcude(winsock2.h)を追加する
大まかな流れ • クライアント側 • Winsockの初期化 • ソケットを作る • 接続先の設定 • 接続できたら通信開始 • 終了したら接続を切断
大まかな流れ • サーバ側 • ソケットを作る • 接続待ちをするIPアドレスとポート番号の設定 • ソケットにアドレス情報を結びつける • 接続を待つ • クライアントから要求が来たら受付 • 通信開始 • ソケットって? • IPアドレスとポート番号を組み合わせたネットワークアドレス
Winsockの初期化・終了 • まずWSADATA型で変数を宣言 • WSADATA wsaData; • WSAStartup(MAKEWORD(2,0),&wsaData); • WSAStartup(Winsockのバージョン, 初期化した状態を入れるための変数); • WSACleanup(); • Winsock機能の終了
ソケットの作成・破棄 • Winsockでソケットは”SOCKET”という変数で表す 全ての通信はSocket()関数が返すSOCKET変数を使う • まず変数の宣言 • SOCKET sock; • Socket関数 • socket(アドレスファミリ,ソケットタイプ,プロトコル): • アドレスファミリ:ネットワークアドレスの種類を表すもの • INET=インターネット • 作成 • sock = socket(AF_INET,SOCK_STREAM,0); • 破棄 • closesocket()関数 • closesocket( 破棄するソケット);
ソケットの設定 • 接続先のIPアドレス・ポート番号を指定 • INADDR_ANY • 相手を特に指定しない • サーバー側でよく用いられる(通信相手を探す時) • INADDR_NONE • IPアドレスが存在しない場合 • クライアント側でよく用いられる(サーバを探してエラーが発生した時)
sockaddr_in構造体 • ネットワークプログラミングを行う上で基本となる構造体 • 接続先のホストや自ホストのIPアドレス・ポート番号を指定するときに用いる • 使用例(クライアント側) • 接続先(サーバ)を指定 • server.sin_family = AF_INET; • server.sin_port = htons(123456); • server.sin_addr.S_un.S_addr = inet_addr(“127.0.0.1");
ソケットの設定 • 接続先のアドレス情報を構造体にまとめる • inet_addr()関数 • 文字列で表現されたIPアドレスを整数に変換 • server.sin_addr.S_un.S_addr = inet_addr(“127.0.0.1”); • htons()関数 • ポート番号をネットワークバイトオーダーに変換する • server.sin_port = htons(12345);
サーバに接続する • connect()関数 • サーバに接続要求を送る • connect(ソケット,接続先アドレス情報が入っている sockaddr_in構造体をsockaddr構造体にキャストしたもの,sockaddr_in構造体の大きさ); • sockaddr構造体 • ソケットプログラミングを行う上で基本となる構造体 • こんな感じ • connect(sock, (struct sockaddr*)&server, sizeof(server));
ソケットをアドレスとポートに結びつける(サーバ側)ソケットをアドレスとポートに結びつける(サーバ側) • bind()関数 • bind(ソケット,アドレス入りのsockaddr_in構造体をsockaddr構造体にキャストしたもの, sockaddr_in構造体の大きさ); • こんな感じ • bind(sock, (struct sockaddr*)&addr, sizeof(addr));
接続リクエストの受付 • listen()関数 • ソケットを接続待ち状態にする • listen(sock,10); • listen( ソケット , 待機状態のリクエストが 格納されるキューの大きさ); • こんな感じ • if(!listen(sock,10)){ printf("listenに失敗"); exit(1); }
クライアントからの接続を確立する • accept()関数 • まずは接続先のアドレス情報の大きさを取得 • len = sizeof(接続先のアドレス情報) • accept(ソケット , 接続先のアドレス情報 , 接続先アドレス情報の大きさ); • こんな感じ • sock2 = accept(sock1, (struct sockaddr*)&client, &len);
データの送受信 • 送信 • send()関数 • send( ソケット , 送信するデータへのポインタ , 送信するデータの長さ , 0 ); • 受信 • memset()関数 • memset(バッファのポインタ,初期化に使う文字, 初期化するバイト数); • recv()関数 • recv( ソケット , 受信するバッファへのポインタ , 受信するデータの長さ , 0 );
課題 • 1.配布するサンプルプログラムを実際に打ってみて 動作を確認(面倒だけど) • 2.五回連続で、クライアントから要求を出せるようにする • 3.「stop」とクライアントが入力したら、接続を解除できる ように改良 • 4.二つの整数を入力すると、サーバ側で和の計算を 行って計算結果をクライアントに返し、クライアント側で 計算結果を表示するプログラムを作成 • 5.自由課題 • これまでの課題の改良(例外処理等)でもいいし、一から 作ってもいい • どんなプログラムなのかの簡単な説明もtxtファイルで一緒に 提出してください
注意事項 • 課題2・3でまとめて一つ、課題4、課題5のサーバ側 クライアント側のファイルをフォルダに入れて提出 • 作成したプログラムファイルは、学籍番号・名前をつけたフォルダの中にまとめる • ファイル名は分かりやすいものをつける • 全部とまでは言わないが、プログラムに説明のコメントをつける