SSブログ

したらばワシもSilentCでTCPをやってみよう 2 [SilentC]

前回は受信を中心に動作確認してみたので、今回は送信をメインに。
マニュアルに拠ると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ワシだけか?、きっとワシだけなんだろうな。


マスタリングTCP/IP 入門編 第4版

マスタリングTCP/IP 入門編 第4版

  • 作者: 竹下 隆史
  • 出版社/メーカー: オーム社
  • 発売日: 2007/02/24
  • メディア: 大型本



詳解TCP/IP〈Vol.1〉プロトコル

詳解TCP/IP〈Vol.1〉プロトコル

  • 作者: W.リチャード スティーヴンス
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2000/12
  • メディア: 単行本



マスタリングTCP/IP 応用編

マスタリングTCP/IP 応用編

  • 作者: Philip Miller
  • 出版社/メーカー: オーム社
  • 発売日: 1998/05
  • メディア: 単行本



nice!(0)  コメント(3)  トラックバック(1) 

nice! 0

コメント 3

noritan

当方でもチェックサムエラーが発生しましたが、理由が分かりました。

通常のコンパイラの場合と異なり、"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) 

hamayan

そうそう、それを後程やってみようと思っていて、出掛けている間にすっかり検証してもらっている。

これ、あれですよね。SilentCには送信専用のバッファが有るのだけれど、チェックサムの計算は送信バッファに転送する前に行っていると言う事なんでしょうね。
と言う事は、HEAP領域から取得した領域も、送信確認が完了する前に使い回した場合、同様の事が起きる可能性が有るという事ですかね。

by hamayan (2008-09-28 21:14) 

noritan

Write関数に引き渡した送信バッファは、そのままコピーもされずにSOKET構造体にリンクされてしまっています。(何故、知っている?)

つまり、"WriteComplete"を確認するまでは、送信バッファは触ってはならないということですね。どうしてもという時にはダブルバッファにして適切に管理しなくちゃいけません。

by noritan (2008-09-28 21:45) 

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 1

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。