- - PR -
ソケット通信処理で発生しているトラブル
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-10-06 18:25
みなさん、始めまして。
現在以下のような現象に悩まされています。 ・CSocket::Send()でデータを送信すると、返り値は正常終了だが20〜30回に1回は 実際にはデータが送信されていない。 ・CASyncSocket::SendTo()で送信先を明示しても同様だった。 ・パケットモニタで確認したところ、アプリで送信しているデータではない(データ部のない) パケットを送信して終了している。 またこのパケットは時々送信されている。 ・過去ログ、TIPSを参考に試しにハイパースレッディングの設定をオフにしてみたところ 発生頻度は低くなったが、ごくまれに発生してしまう。 ・使用する端末のメーカーによって、発生頻度が異なる。(どれもPEN4) ・使用OSはXP、開発言語はVC++、MFC。 Send()の後で切断すれば問題ないのですが、仕様上できれば切断しないでおきたいのです。 データ部のないパケットが何なのかもわかりません。 ソフト・ハード含めた情報・アドバイスをどなたか教えていただけないでしょうか。 よろしくお願い致します。 | ||||||||||||
|
投稿日時: 2007-10-06 19:53
UDPの話?それともTCPの話? Sendメソッドはメモリ上の送信キューにデータを格納できた時点で正常終了を返します。したがってその時点で送信されていないことをいぶかっているなら、それで正常です。UDPは到達保障があるわけではないので、データが失われることもあるでしょう。
TCPですか? データ部なしのパケットを送るのは普通のことですけど。 ACKとかRSTなどはデータなしで送られるので、それを見ているのでは。
それで発生しなくなるとしたら、排他関連の単なるバグですよね。 #あとはもう少し詳しく、どのような頻度でどの程度のデータを送って、そんな風にキャプチャしているのかも教えてくれる回答しやすいと思う。 | ||||||||||||
|
投稿日時: 2007-10-06 22:01
甕星さん、早々の回答ありがとうございます。
すみません、TCPです。
CSocket派生クラスのOnReceive()内で32バイトの固定データを送信するようにしています。送受信のロジックは「WinSock 2.0」という本のサンプルコードがベースとなっています。 排他関連のバグですか...今までうまくいってたのはたまたまなんですかね。 | ||||||||||||
|
投稿日時: 2007-10-10 11:53
そう言う言い方されても「WinSock 2.0」と言う本をすべての人が持っているわけじゃないのですけど・・・。 固定長データの送受信でありがちなミスとして、受信データ長が常に32バイト固定になると勘違いをしているとか?下位のレイヤで分割したり、結合したりして送信されるので、必ずしも32バイトずつ送信したから32バイトずつ受信できるわけではないです。そのあたりのつくりは大丈夫? |
1