- PR -

ソケット通信処理で発生しているトラブル

1
投稿者投稿内容
のり
会議室デビュー日: 2007/10/06
投稿数: 2
投稿日時: 2007-10-06 18:25
みなさん、始めまして。
現在以下のような現象に悩まされています。

・CSocket::Send()でデータを送信すると、返り値は正常終了だが20〜30回に1回は
 実際にはデータが送信されていない。

・CASyncSocket::SendTo()で送信先を明示しても同様だった。

・パケットモニタで確認したところ、アプリで送信しているデータではない(データ部のない)
 パケットを送信して終了している。
 またこのパケットは時々送信されている。

・過去ログ、TIPSを参考に試しにハイパースレッディングの設定をオフにしてみたところ
 発生頻度は低くなったが、ごくまれに発生してしまう。

・使用する端末のメーカーによって、発生頻度が異なる。(どれもPEN4)

・使用OSはXP、開発言語はVC++、MFC。


Send()の後で切断すれば問題ないのですが、仕様上できれば切断しないでおきたいのです。
データ部のないパケットが何なのかもわかりません。

ソフト・ハード含めた情報・アドバイスをどなたか教えていただけないでしょうか。
よろしくお願い致します。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2007-10-06 19:53
引用:

のりさんの書き込み (2007-10-06 18:25) より:
みなさん、始めまして。
・CSocket::Send()でデータを送信すると、返り値は正常終了だが20〜30回に1回は
 実際にはデータが送信されていない。


UDPの話?それともTCPの話?
Sendメソッドはメモリ上の送信キューにデータを格納できた時点で正常終了を返します。したがってその時点で送信されていないことをいぶかっているなら、それで正常です。UDPは到達保障があるわけではないので、データが失われることもあるでしょう。

引用:

・パケットモニタで確認したところ、アプリで送信しているデータではない(データ部のない)
 パケットを送信して終了している。
 またこのパケットは時々送信されている。


TCPですか?
データ部なしのパケットを送るのは普通のことですけど。
ACKとかRSTなどはデータなしで送られるので、それを見ているのでは。

引用:

・過去ログ、TIPSを参考に試しにハイパースレッディングの設定をオフにしてみたところ
 発生頻度は低くなったが、ごくまれに発生してしまう。


それで発生しなくなるとしたら、排他関連の単なるバグですよね。

#あとはもう少し詳しく、どのような頻度でどの程度のデータを送って、そんな風にキャプチャしているのかも教えてくれる回答しやすいと思う。

のり
会議室デビュー日: 2007/10/06
投稿数: 2
投稿日時: 2007-10-06 22:01
甕星さん、早々の回答ありがとうございます。

引用:

TCPですか?
データ部なしのパケットを送るのは普通のことですけど。
ACKとかRSTなどはデータなしで送られるので、それを見ているのでは。


すみません、TCPです。


引用:

・過去ログ、TIPSを参考に試しにハイパースレッディングの設定をオフにしてみたところ
 発生頻度は低くなったが、ごくまれに発生してしまう。

それで発生しなくなるとしたら、排他関連の単なるバグですよね。

#あとはもう少し詳しく、どのような頻度でどの程度のデータを送って、そんな風にキャプチャしているのかも教えてくれる回答しやすいと思う。


CSocket派生クラスのOnReceive()内で32バイトの固定データを送信するようにしています。送受信のロジックは「WinSock 2.0」という本のサンプルコードがベースとなっています。
排他関連のバグですか...今までうまくいってたのはたまたまなんですかね。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2007-10-10 11:53
引用:

のりさんの書き込み (2007-10-06 22:01) より:
甕星さん、早々の回答ありがとうございます。
送受信のロジックは「WinSock 2.0」という本のサンプルコードがベースとなっています。


そう言う言い方されても「WinSock 2.0」と言う本をすべての人が持っているわけじゃないのですけど・・・。

固定長データの送受信でありがちなミスとして、受信データ長が常に32バイト固定になると勘違いをしているとか?下位のレイヤで分割したり、結合したりして送信されるので、必ずしも32バイトずつ送信したから32バイトずつ受信できるわけではないです。そのあたりのつくりは大丈夫?
1

スキルアップ/キャリアアップ(JOB@IT)