C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: CAsyncSocket での非同期受信について


(過去ログ 57 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■32571 / inTopicNo.1)  CAsyncSocket での非同期受信について
  
□投稿者/ macochin (1回)-(2009/02/09(Mon) 21:08:23)

分類:[C/C++] 

初めまして、macochin と申します。

現在、旅行会社や駅の窓口の方が使用するような窓口端末の開発を行っております。
私の担当はその端末ではなく、端末が接続するサーバ側の動作をPC上でエミュレートするソフトの開発を行っております。
(端末をローカル環境でテストするために使用しています)

端末⇔サーバ間はTCP/IPで通信を行っておりますが、
私が担当しているエミュレートソフトは MFC の CAsyncSocket を使用して実装しています。

CAsyncSocket を使用しているので OnReceive メソッド内で受信処理を行っているのですが、
突然 OnReceive メソッドが呼ばれなくなる現象が発生してしまいます。
そうなると一切の受信処理ができなくなってしまい困っています。
(OnClose などのイベントは呼ばれるのですが、何故か OnReceive だけ呼ばれない...)

以下、その時に確認した内容です。
・パケットキャプチャで確認したところパケット自体はPCまで来ている
・OnReceive メソッド内では recv メソッドは1度のみ使用している
・データの send はできる
・OnClose や OnAccept などは呼ばれる

以下、開発環境です。
・Windows Vista Business
・Visual Studio 2005 VC++(MFC)
・OpenSSL(暗号化してもしなくても発生する)

宜しくお願い致します。
引用返信 編集キー/
■32573 / inTopicNo.2)  Re[1]: CAsyncSocket での非同期受信について
□投稿者/ オショウ (91回)-(2009/02/09(Mon) 22:46:09)
> CAsyncSocket を使用しているので OnReceive メソッド内で受信処理を行っているのですが、
> 突然 OnReceive メソッドが呼ばれなくなる現象が発生してしまいます。
> そうなると一切の受信処理ができなくなってしまい困っています。
> (OnClose などのイベントは呼ばれるのですが、何故か OnReceive だけ呼ばれない...)

  初回の1回だけ受信イベントが発生して2回目以降発生しない
  のでしょうか?

  もしそうであれば・・・
  再度、OnRecieveの非同期受信イベントの登録をし直さないと
  いけないはずです。

※ 最近、MFC使っていないので・・・
  .NETも非同期処理は同様の手順だと思ってますので、推測で
  書いてます。

  違ったらすいません・・・

以上。
引用返信 編集キー/
■32575 / inTopicNo.3)  Re[2]: CAsyncSocket での非同期受信について
□投稿者/ macochin (2回)-(2009/02/09(Mon) 23:14:06)
オショウ様

早速のご返信ありがとうございます。

> 初回の1回だけ受信イベントが発生して2回目以降発生しない
> のでしょうか?
>
> もしそうであれば・・・
> 再度、OnRecieveの非同期受信イベントの登録をし直さないと
> いけないはずです。

いえ、毎回イベントが発生するので、
登録のし直しということは必要ないかなと思います。

ただ、何かが原因となって突然イベントが発生しなくなってしまうんです。
コードをみてもイベントの解除や ShutDown メソッドなどもコールしておらず、
何が原因なのか、何が起こっているのか不明な状態です。
引用返信 編集キー/
■32579 / inTopicNo.4)  Re[3]: CAsyncSocket での非同期受信について
□投稿者/ オショウ (92回)-(2009/02/10(Tue) 00:19:55)
> いえ、毎回イベントが発生するので、
> 登録のし直しということは必要ないかなと思います。
>
> ただ、何かが原因となって突然イベントが発生しなくなってしまうんです。
> コードをみてもイベントの解除や ShutDown メソッドなどもコールしておらず、
> 何が原因なのか、何が起こっているのか不明な状態です。

  OnReceiveが止まる要件に、FINパケットの受信の可能性は?

  あと、セッションを開いてから途中、無通信状態が90秒以上
  あるとか・・・その場合、OS側で自動的にセッションが、
  閉じられる可能性があったかと。

※ FINが受信されれば、ゼロバイト受信イベントがあります。
  その場合、一旦、セッションをクローズして再オープンの
  手順を踏まないといけないのですが・・・

  それでもない場合、パケットモニタでジックリとログ解析
  しないとなんとも・・・

以上。
引用返信 編集キー/
■32582 / inTopicNo.5)  Re[4]: CAsyncSocket での非同期受信について
□投稿者/ 2リットル (1回)-(2009/02/10(Tue) 09:37:51)
OnReceive()内でReceive()を実行しないパスがありませんか?
引用返信 編集キー/
■32627 / inTopicNo.6)  Re[5]: CAsyncSocket での非同期受信について
□投稿者/ macochin (3回)-(2009/02/11(Wed) 00:13:55)
オショウ様
2リットル様

ご返信ありがとうございます。

会社でウェブを使用することができなくて、
返信が遅くなりました。

> OnReceiveが止まる要件に、FINパケットの受信の可能性は?

パケットモニタでみたところ FIN パケットは受信していませんでした。

> あと、セッションを開いてから途中、無通信状態が90秒以上
> あるとか・・・その場合、OS側で自動的にセッションが、
> 閉じられる可能性があったかと。

この件は知りませんでした。
しかし、およそ120秒おきにポーリングを行っているのですが、
正常なときはきちんとパケットを受信し応答を返しているので
自動的にセッションが閉じられていることはないと思っています。
(OnReceive が呼ばれなくなる状態でも send は可能なので)

> OnReceive()内でReceive()を実行しないパスがありませんか?

コードをじっくり見直しましたが、
残念ながら例外が発生しない限り必ず Receive() を実行しています。

> それでもない場合、パケットモニタでジックリとログ解析
> しないとなんとも・・・

はい、やっぱりそれしかないかなと思い始めてます。
アプリ自体で出力しているログとパケットを見ていて気が付いたのですが、
OnReceive() の処理が終わる前に send が行われる場合があるようで、
これが原因で OnReceive() が呼ばれなくなる場合はあるのでしょうか?

引用返信 編集キー/
■32642 / inTopicNo.7)  Re[6]: CAsyncSocket での非同期受信について
□投稿者/ オショウ (93回)-(2009/02/11(Wed) 20:43:41)
ちょっと違うかもしれませんが、下記の内容を確認してみて
下さい。

http://support.microsoft.com/default.aspx/kb/185728/ja

以上。
引用返信 編集キー/
■32643 / inTopicNo.8)  Re[7]: CAsyncSocket での非同期受信について
□投稿者/ オショウ (94回)-(2009/02/11(Wed) 20:45:54)
それともう1点
sendですが、CAsyncSocket::OnSendを使っていないのでしょうか?

受信が非同期なら送信も非同期であれば、オーバーラップしても
問題はないかと・・・

以上。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -