したらばワシもSilentCでTCPをやってみよう 2 [SilentC]
前回は受信を中心に動作確認してみたので、今回は送信をメインに。
マニュアルに拠るとSilentCは970bytesまでデータの送信が可能と言う事で、こんなプログラムを作成してみました。
相手は自作のDISCARD(破棄)サーバーです。
つまり”hello”から続く100bytesのデータを10回送信してみようと。ちなみに”hello”だけの時は成功しています。
例によってパケットモニタも仕掛けてあります。
すると、あれ???、いきなりチェックサムエラーが発生している。
全然送信が進みません。
しかし極偶に成功したりします。同じ内容なのに???。※上の解析結果は、同じ内容での失敗と成功例です。
まあ一応970bytesでもやってみますか。
orzワシだけか?、きっとワシだけなんだろうな。
マニュアルに拠るとSilentCは970bytesまでデータの送信が可能と言う事で、こんなプログラムを作成してみました。
相手は自作のDISCARD(破棄)サーバーです。
dis_cli() { int i; char soc = CreateSocket( 1 ); long dip = GetIP( "192.168.1.30" ) Connect( soc, dip, 9 ); for( i = 0; i < 10; i++ ) { if( Write( soc, "hello", 100 ) < 0 ) break; if( WaitWriteComplete( soc ) < 0 ) break; } CloseSocket( soc ); }
つまり”hello”から続く100bytesのデータを10回送信してみようと。ちなみに”hello”だけの時は成功しています。
例によってパケットモニタも仕掛けてあります。
すると、あれ???、いきなりチェックサムエラーが発生している。
<< パケット 60 >> --- TCPヘッダ [1024] → [9] ------------------------------------------------- 【発信元ポート番号】1024 【発信先ポート番号】9 (DISCARD) 【シーケンス番号】623055264 (0x252311A0) 【応答番号】1701643170 (0x656D03A2) 【データオフセット】20 (0x14) 【フラグ】【URG】0【ACK】1【PSH】1【RST】0【SYN】0【FIN】0 【ウィンドウ】1454 (0x05AE) バイト 【チェックサム】0xD4A6 (NG) 【緊急ポインタ】0 【オプション】なし ---【データ】100 (0x0064) バイト --------------------------------- SJIS ------- 0000 68 65 6C 6C 6F 00 00 00 - 00 00 05 A2 00 06 00 05 hello......「.... 0010 57 61 69 74 57 72 69 74 - 65 43 6F 6D 70 6C 65 74 WaitWriteComplet 0020 65 00 00 00 00 06 00 05 - 04 00 00 09 25 23 11 A0 e...........%#.. 0030 65 6D 03 A2 50 18 05 AE - D4 A6 00 00 00 00 00 00 em.「P..ョヤヲ...... 0040 50 72 53 74 72 28 20 22 - 67 65 74 20 2F 2E 5C 72 PrStr( "get /.\r 0050 5C 6E 22 20 29 3B 0D 0A - 20 20 20 20 57 72 69 74 \n" );.. Writ 0060 65 28 20 6E e( n << パケット 62 >> --- TCPヘッダ [1024] → [9] ------------------------------------------------- 【発信元ポート番号】1024 【発信先ポート番号】9 (DISCARD) 【シーケンス番号】623055264 (0x252311A0) 【応答番号】1701643170 (0x656D03A2) 【データオフセット】20 (0x14) 【フラグ】【URG】0【ACK】1【PSH】1【RST】0【SYN】0【FIN】0 【ウィンドウ】1454 (0x05AE) バイト 【チェックサム】0x000B (OK) 【緊急ポインタ】0 【オプション】なし ---【データ】100 (0x0064) バイト --------------------------------- SJIS ------- 0000 68 65 6C 6C 6F 00 00 00 - 00 00 05 A2 00 06 00 05 hello......「.... 0010 57 61 69 74 57 72 69 74 - 65 43 6F 6D 70 6C 65 74 WaitWriteComplet 0020 65 00 00 00 00 00 00 00 - 04 00 00 09 25 23 11 A0 e...........%#.. 0030 65 6D 03 A2 50 18 05 AE - D4 A6 00 00 00 00 00 00 em.「P..ョヤヲ...... 0040 50 72 53 74 72 28 20 22 - 67 65 74 20 2F 2E 5C 72 PrStr( "get /.\r 0050 5C 6E 22 20 29 3B 0D 0A - 20 20 20 20 57 72 69 74 \n" );.. Writ 0060 65 28 20 6E e( n
全然送信が進みません。
しかし極偶に成功したりします。同じ内容なのに???。※上の解析結果は、同じ内容での失敗と成功例です。
まあ一応970bytesでもやってみますか。
<< パケット 507 >> --- TCPヘッダ [1024] → [9] ------------------------------------------------- 【発信元ポート番号】1024 【発信先ポート番号】9 (DISCARD) 【シーケンス番号】523522464 (0x1F3451A0) 【応答番号】2341297110 (0x8B8D5BD6) 【データオフセット】20 (0x14) 【フラグ】【URG】0【ACK】1【PSH】1【RST】0【SYN】0【FIN】0 【ウィンドウ】1454 (0x05AE) バイト 【チェックサム】0xF85A (NG) 【緊急ポインタ】0 【オプション】なし ---【データ】970 (0x03CA) バイト --------------------------------- SJIS ------- 0000 68 65 6C 6C 6F 00 00 00 - 00 00 05 09 00 04 00 03 hello........... 0010 00 00 00 02 00 00 00 05 - C0 A8 01 1E 00 0C 00 0B ........タィ...... 0020 02 05 04 18 00 00 00 00 - 00 00 00 00 20 00 39 98 ............ .9. 0030 03 CA 04 00 00 09 00 00 - C0 A8 01 1E 1F 34 51 A0 .ハ......タィ...4Q. 0040 8B 8D 5B D6 00 00 00 00 - 07 0E 0D 01 00 07 00 06 牛[ヨ............ 0050 02 69 00 02 00 00 04 73 - 6F 63 00 01 05 04 64 69 .i.....soc....di 0060 70 00 04 C0 A8 01 1E 00 - 00 06 00 05 31 39 32 2E p..タィ.......192. 0070 31 36 38 2E 31 2E 33 30 - 00 20 00 39 9E 0C 00 00 168.1.30. .9.... 0080 00 06 00 05 57 61 69 74 - 57 72 69 74 65 43 6F 6D ....WaitWriteCom 0090 70 6C 65 74 65 00 00 00 - 00 06 00 05 04 00 00 09 plete........... 00A0 1F 34 51 A0 8B 8D 5B D6 - 50 18 05 AE F8 5A 00 00 .4Q.牛[ヨP..ョ.. 00B0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 00C0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 00D0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 00E0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 00F0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 0100 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 0110 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 0120 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 0130 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 0140 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 0150 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 0160 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 0170 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 0180 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 0190 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 01A0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 01B0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 01C0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 01D0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 01E0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 01F0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 0200 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 0210 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 0220 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 0230 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 0240 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 0250 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 0260 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 0270 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 0280 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 0290 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 02A0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 02B0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 02C0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 02D0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 02E0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 02F0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 0300 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 0310 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 0320 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 0330 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 0340 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 0350 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 0360 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 0370 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 0380 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 0390 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 03A0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 03B0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................ 03C0 00 00 00 00 00 00 00 00 - 00 00 ..........
orzワシだけか?、きっとワシだけなんだろうな。
2008-09-28 10:39
nice!(0)
コメント(3)
トラックバック(1)
当方でもチェックサムエラーが発生しましたが、理由が分かりました。
通常のコンパイラの場合と異なり、"hello"から100バイトの領域というのは、実行時にヒープに割り当てられます。このため、"hello"以降の94バイトは、プログラムの実行中に別の用途で使用される可能性があります。チェックサムが変だったのは、チェックサム計算時の94バイトの内容とデータ送信時の94バイトの内容が異なっていたためと思われます。
char *message = MemoryAlloc( 100 );
:
StrCpy( message, "hello" );
:
if( Write( soc, message, 100 ) < 0 ) break;
こうすると、エラーも無く送信することができるようになりました。
by noritan (2008-09-28 16:38)
そうそう、それを後程やってみようと思っていて、出掛けている間にすっかり検証してもらっている。
これ、あれですよね。SilentCには送信専用のバッファが有るのだけれど、チェックサムの計算は送信バッファに転送する前に行っていると言う事なんでしょうね。
と言う事は、HEAP領域から取得した領域も、送信確認が完了する前に使い回した場合、同様の事が起きる可能性が有るという事ですかね。
by hamayan (2008-09-28 21:14)
Write関数に引き渡した送信バッファは、そのままコピーもされずにSOKET構造体にリンクされてしまっています。(何故、知っている?)
つまり、"WriteComplete"を確認するまでは、送信バッファは触ってはならないということですね。どうしてもという時にはダブルバッファにして適切に管理しなくちゃいけません。
by noritan (2008-09-28 21:45)