2008-07-01

socket programming

2008/07/01



本日の話

・ネットワークに関するシステムコール

-ソケット

-Client/Server型システムの携帯

-システムコール

-標準ライブラリ





・ソケット



・基本型:クライアント・サーバ型
UNIXにはもともとスレッドという概念がない。
スレッド使えるようになったのは5年前の話

プロセスをフォークすることは難しい。
cf:コピーオンライト
→毎回毎回プロセスをフォークするとコストが大きい
→スレッド使ったり別の方式を使ったりする。

・反復サーバ型
サーバがクライアントのリクエストをリプライする。
受け取った順に処理する。
→もし、サーバの待ち時間が長い場合はサーバが無駄に動いてしまう。
→多くのクライアントからのリクエストを処理する時には向いていない。

・並行サーバ型
-ファイルの流れ
クライアント→サーバー→(フォーク)CP→クライアント
→サーバはリクエストを受け付けて、子プロセスを生成するだけで住む
→ほとんどのサーバはこの形で作られている。

ただし、スレッドに変えてもそんなにオーバーヘッドが減る分けではない。
実際にはもうちょっと複雑な処理をして、オーバーヘッドを減らしている。

・同期通信、非同期通信

-同期通信
リクエストが帰ってくるまで動かない
ex.失いたくない貴重な情報の時

-非同期通信
リクエストが帰ってくるかどうかにかかわらず動きつづける。
割り込みのような形でリプライを受け取る。
ex.音楽再生とか


・unicast, broadcast, multicast
-unicast
1 on 1通信

-broadcast
ネットワーク上の全マシンに対して送信
e.g. DHCP
「僕はあなたのアドレスを知らないけど、あなたのIPアドレスが欲しい!」

-multicast
特定のグループへの加入者に対する同報


・ソケット通信の手順(ストリームソケット)
-Client
socket ソケットのせいせい
bind ソケットへの名前付け
connect
read/write
close


-Sever
socket
bind
listen
accept
read/write
close



・UBPの場合
-Client
socket ソケットの生成
bind ソケットへの名前付け
sendto データ送信
recvdrom データ受信
close ソケットの除去

-Server
socket
bind
recvfrom
sendto


・ソケットの生成
-書式
int socket(int domain, int type, int protocol)
int domein:
使用するドメイン種別

int type:ソケットタイプ
UDPを使いたい場合 SOCK_DGRAM

int protocol: 下位プロトコルの指定
0=default

・ソケットの名前付け:bind
取ってきたファイルディスクリプタに対して名前をつける。
int bind(int socketfd, struct sockaddr(自分のアドレスの定義) *my_addr(データスタラクチャの長さ), sockelen_t addrlen)



・バイトオーダーとホストオーダー
BIG-endianとLittle-endianの違い
→各マシンごとに違うフォーマットを使っている場合は、意識して直す必要がある。
→CPUなどのアーキテクチャを使用する必要がある。

このため、変数関数が用意されている
- htonl, htons: host->nw
- ntohl, ntohs: nw->host

h to nl
n to hl


・ソケットアドレスの構造体
-port
送り側と受け手側で違うポート番号を使う必要があるので、要注意。

bzero((void *)&server, sizeof(server));
server sin_family = AF_INET;


・IPアドレスの与え方
- バイナリで与える場合(e.g. 0Xac105504)←バイトオーダーで考える必要がある。

- ドット区切り10進表記で与える場合(e.g. 172.16.85.4)


- hostnameで与える場合
gethostbyname ライブラリ関数を使用(後述)
引数にホスト名が入る。
hostentから、アドレスが返ってくる。
IPaddressを知ることができる。いf

・listen:接続受け入れ準備
接続要求を格納するキュー
→いくつ、接続を格納するキューを確保するか、のために使う。

・connect:接続要求発信
- streamsocket使用時における通信路確立
あとで例題

・accept:接続要求許可
int sockfd:
struct sockaddr:相手のアドレス

この関数が返す引数が使うファイルディスクリプタになる。

・read/write:データ送受信


・ストリームソケットが他の通信手順




・無線デバイスドライバのインストール
Linuxのデバイスドライバをダウンロード→インストール

0 件のコメント: