Socket通信
Socket通信はネットワーク上でほかのPCなどと情報のやり取りに使うもの。
今回はサーバとクライアントを用意してその間を接続するプログラムの説明。
[サーバ側のプログラムの流れ]
ソケットの作成→ソケットアドレスの作成→バインド→リスン→アクセプト→データの送受信
ソケットの作成・・・クライアントからの接続要求を探すためのソケットの作成を行う。
ソケットアドレスの作成・・・作成したソケットに対しての設定を行う。
sin_familyにはAF_INETを指定するのが基本らしい。
sin_portは接続を受け入れるポート番号。使われていないポートを適当に使った。
sin_addr.s_addrは接続を許可するIPの指定を行う。今回は特に制限を付けないので全て許可するINADDR_ANYを使った。
バインド・・・バインドは上で作成したソケットアドレスを作成したソケットに適応する処理。
リスン・・・リスンはクライアントからの接続要求があるかどうかを調べ、接続の許可を行う。
アクセプト・・・実際にクライアントとの接続を行う。アクセプトにより新たなソケットが作成され、これがクライアントとの通信用のソケットとなる。
[クライアント側のプログラムの流れ]
ソケットの作成→ソケットアドレスの作成→コネクト→データの送受信
ソケットの作成・・・サーバと接続を行うためのソケットの作成。
ソケットアドレスの作成・・・接続先のアドレスやポートの設定。
sin_familyはサーバのときと同じくAF_INETを使用するのが一般らしい。
sin_portはサーバで設定したポート番号と同じものを使用。
sin_addr.s_addrは接続先のIPを指定するか、接続先のマシン名を指定する。マシン名を使用する場合はgethostbyname関数を、IPを指定する場合にはinet_addr関数を使用する。今回はIPを指定する方法を使った。
コネクト・・・上で作成したソケットとソケットアドレスを使用して実際にサーバに接続要求を送信して、接続の確立を行う。
[データの送受信]
データの送信・・・send関数を使用する。
データの受信・・・recv関数を使用する。
この関数はソース見れば分かると思う。
[windowsでのソケット通信]
windowsで通信しようとするとちょっとめんどくさい。
必要な設定
Windowsでソケット通信を行うにはwinsockを使う。VCを使う場合、winsockを利用するにはプロジェクトの設定にあるリンクの部分にwinsock32.libを追加しなくてはいけない。また、プログラム中でwinsock.hを読み込む必要がある。
winsockの初期化
windowsではソケットの作成を行う前にwinsockの初期化を行わなくてはいけない。WSAStartup関数を使って初期化を行う。
WORD version = MAKEWORD ( 1,1 ); ・・・winsockのバージョンの設定
WSADATA aWsa; ・・・winsock情報構造体らしい。
WSAStartup ( version,aWsa ); ・・・これで初期化完了
WSACleanup (); ・・・使った後の後始末
winsockの初期化さえしてしまえば後はwindowsもlinuxも大して変わらないような気がしますな。今のところは何とか通信が行えているのでよしとしましょう。
今回使ったソースファイル。
Server
Client