サンプル集 |
■VC ■C# ■Java ■LinuxC ■MS-DOS ■bash ■Excel VBA ■VBScript ■PHP ■HTML ■perl ■iPhone ■Android ■Lua ■other |
Linuxコマンド |
debian メモ |
apache2 メモ |
MySQL メモ |
Oracle メモ |
HOME |
通信プログラムのクライアント側です。
◆環境OS | Linux obsax3 3.0.6 #1 SMP Fri Nov 16 11:53:45 JST 2012 armv7l GNU/Linux |
---|---|
gcc | 4.4.5 (Debian 4.4.5-8) |
サーバーへ接続後、メッセージの受信を wait と don't wait のどちらかを選択できるようにしました。 ログ出力関数 outputLog はサーバー側のプログラムを使いました。
LC112Server.c | ||
|
メイクファイルです。
makefile | ||
|
まずはサーバー側のプログラムを起動します。
13:12:18 SV LC112Server START
13:12:18 SV 接続を待っています
サーバー側が接続待ちになりました。
別のターミナルを開き、クライアント側を起動します。
13:13:06 CL LC113Client START
13:13:06 CL connect OK
13:13:06 CL ----------------------------------
13:13:06 CL (1) recv message(wait)
13:13:06 CL (2) recv message(don't wait)
13:13:06 CL (9) end
13:13:06 CL input number:
サーバーに接続し処理番号の入力待ちになりました。 サーバー側も接続を受け付け、処理番号の入力待ちになりました。
13:13:06 SV ----------------------------------
13:13:06 SV (1) send messase
13:13:06 SV (9) end
13:13:06 SV input number:
サーバー側でメッセージを送ります。1 を入力しEnterを押します。
13:15:17 SV send OK!!
13:15:17 SV ----------------------------------
13:15:17 SV (1) send messase
13:15:17 SV (9) end
13:15:17 SV input number:
sendに成功し、次の処理番号入力待ちになりました。
クライアント側で受信(wait)してみます。 クライアント側で 1を入力しEnterを押します。
13:16:01 CL recv=[send server!!] len=[13] errno=[0] msg=[Success]
13:16:01 CL ----------------------------------
13:16:01 CL (1) recv message(wait)
13:16:01 CL (2) recv message(don't wait)
13:16:01 CL (9) end
13:16:01 CL input number:
メッセージを正しく受信し、次の処理番号入力待ちになりました。 9 を入力しクライアント側を終了します。
13:17:07 CL 終了します。
13:17:07 CL LC113Client END
サーバー側でも 9 を入力し終了します。
13:17:50 SV LC112Server END
切断検知のテスト
クライアントが接続後、サーバーが切断(close)した場合どうなるかテストします。
@接続確立後、サーバーがclose
まずはサーバーを起動し、続いてクライアントを起動し両方とも処理番号入力待ちにします。 この状態でサーバーを 9 で終了させます。
13:36:42 SV 終了します。
13:36:42 SV LC112Server END
サーバー終了後、クライアント側は 1 でメッセージの受信を試みたところ以下の結果になりました。
13:36:45 CL recv=[] len=[0] errno=[0] msg=[Success]
13:36:45 CL ----------------------------------
13:36:45 CL (1) recv message(wait)
13:36:45 CL (2) recv message(don't wait)
13:36:45 CL (9) end
13:36:45 CL input number:
recvが正常終了しています。errno は 0。メッセージも Success となっています。 再度、1 を入力して受信してみましたが結果は同じでした。2 の don't wait で受信しても結果は同じでした。
A接続確立後、クライアント側が受信待ち状態のときにサーバーがclose
まずはサーバーを起動し、続いてクライアントを起動し両方とも処理番号入力待ちにします。 この状態でクライアントを 1 で受信待ち状態にします。
13:43:33 CL connect OK
13:43:33 CL ----------------------------------
13:43:33 CL (1) recv message(wait)
13:43:33 CL (2) recv message(don't wait)
13:43:33 CL (9) end
13:43:33 CL input number: 1
この状態でサーバーを 9 で終了させます。
13:44:44 SV 終了します。
13:44:44 SV LC112Server END
サーバーが終了すると、クライアントは空メッセージを受信し、次の処理番号入力待ちになりました。
13:44:44 CL ----------------------------------
13:44:44 CL (1) recv message(wait)
13:44:44 CL (2) recv message(don't wait)
13:44:44 CL (9) end
13:44:44 CL input number:
再度、1 を入力して受信してみましたが結果は同じでした。2 の don't wait で受信しても結果は同じでした。
B接続確立後、クライアント側が受信待ち状態のときにサーバーを強制終了(kill)
まずはサーバーを起動し、続いてクライアントを起動し両方とも処理番号入力待ちにします。 この状態でクライアントを 1 で受信待ち状態にします。 その状態でサーバープロセスを kill します。
14:12:40 SV 接続を待っています
14:12:45 SV accept OK
14:12:45 SV ----------------------------------
14:12:45 SV (1) send messase
14:12:45 SV (9) end
14:12:45 SV input number: Killed
処理番号入力待ちのカーソルが表示されていた位置に「Killed」と表示され終了しました。 クライアント側は今までと同じく、空メッセージを受信し、次の処理番号入力待ちになりました。
14:13:12 CL ----------------------------------
14:13:12 CL (1) recv message(wait)
14:13:12 CL (2) recv message(don't wait)
14:13:12 CL (9) end
14:13:12 CL input number:
don't wait でも結果は同じでした。
メッセージが無い時の受信(don't wait)
メッセージが無い時に受信(wait)を実行すると、メッセージが書き込まれるまで止まります。 メッセージが無い時に受信(don't wait)を実行すると次のエラーが発生します。
wait と don't wait の違い
受信のwaitとdon't waitで次のように動作が違いました。
メッセージ | 接続 | wait | don't wait |
---|---|---|---|
有り | OK | 読み込む | 読み込む |
Close | 読み込む | 読み込む | |
無し | OK | メッセージが書き込まれるまで待つ(止まる) | 返り値が -1 になり errno に 11 (EAGAIN) が設定される。 |
Close | 返り値が 0 になり空メッセージを受信する。 | 返り値が 0 になり空メッセージを受信する。 |
上記の結果より don't wait で受信して、返り値が 0 の場合、接続が切断されたと判断しても良さそうです。
Copyright (C) 2013 ymlib.com