【CAsyncSocket::OnReceive()呼び出しが遅れる?】
MFCのCAsyncSocketを使ってTCP/IPクライアントアプリケーションより、
別マシン上のサーバアプリケーションに対して、以下の手順で非同期通信をおこなっています。
【クライアント】※以下CAsyncSocketの派生クラス関数です
接続:Connect()
電文送信:Send()
*送信通知:OnSend() ※送信しきれなかったデータ送信
(実際には送信処理の分割は発生していません)
*受信通知:OnReceive()
電文受信:Recv() ※ヘッダ部約60バイト分受信
受信通知:OnReceive() -----------複数回受信を想定
→電文受信:Recv() ※残りのデータ受信
↓
(データ受信完了後)
通信終了:ShutDown()
切断:Close()
クライアントから送信する電文データサイズは6000バイト弱の固定長です。
サーバから返信される電文データサイズは6000バイト弱または100バイト弱どちらかの固定長です。
サーバアプリケーションは、クライアントからの電文受信後すぐに応答電文を返信しています。
現在、*印のOnSend()呼び出し~OnReceive()呼び出しの間で、ある環境では3、4秒程度必ずかかります。
(受信電文データサイズ6000バイト弱・100バイト弱どちらも発生します)
ヘッダ部約60バイト受信後は、遅れは発生していないようです。
CAsyncSocket::SetSockOpt()で送信・受信バッファサイズを65537バイトに設定してみたのですが、
改善されませんでした。
同じ(と思われる)環境を自作して(サーバアプリはテスト用自作アプリ)試してみたのですが
今のところ再現しません。
SocketDebuggerFree(http://sdg.ex-group.jp/)を使用して同じ電文データをサーバアプリに
送信してみたところ、上記のような遅延は発生せず送信後すぐに応答電文受信処理が実行されました。
パケット分割が発生しているようで、6000バイト弱のデータを3回に分けて受信しています。
クライアントアプリでもそのように分割受信されることを想定したのですが、ヘッダ部を受信した
後に1回のOnReceive()内で残りのデータすべてをReceive()によって受信しています。
(自作環境では、ヘッダ部受信後OnReceive()×2回で残りのデータを受信しています)
ちなみに、クライアントマシンよりサーバマシンに社内LANを経由して接続してみたところ、
*印間の処理で2秒程度の遅延が発生します。SocketDebuggerFreeでは遅延が発生しません。
試しに、CSocketクラスとCSocketFileクラスを使用して以下の手順で処理を実行してみましたが、
同様に*印の処理の間で3、4秒程度の受信遅れが発生しました。
CSocket::Create()
CSocket::Connect()
*CSocketFile::Write()
*CSocketFile::Read() ※ヘッダ部約60バイト分受信
CAsyncSocket::IOCtl(FIONREAD, XXX) ←※必要なデータサイズ分受信可能になるまでループ
CSocketFile::Read() ※残りのデータ受信
:
上記のソケット関連関数をAPIの関数に入れ替えてみたのですが、変わりはありませんでした。
自作環境では、受信遅れは発生していません。
遅れが発生する環境の詳細がわからないので恐縮ですが、なにかお気づきの点をご指摘いただければ
幸いです。
開発環境
OS:Windows XP Professional Version 2002 SP3
Microsoft Visual C++ .NET
クライアントアプリの運用環境
OS:Windows Server 2003(SP2?)
サーバアプリの運用環境
不明
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
>なにかお気づきの点をご指摘いただければ
その回線で多数の通信が行われていれば普通に遅延が発生する
可能性はあると思いますが
(どこか壊れかけてて再送繰り返してるとか)
サーバマシンとクライアントマシンは同一LAN上に存在しているのでしょうか?
(そうだとするとサーバの運用環境が分からないってのも謎ですが)
環境・アプリによるので一概に言えませんが
遅延が無い前提で考えるのが間違ってるような気もします
この回答への補足
早速のご回答、どうもありがとうございます。
> サーバマシンとクライアントマシンは同一LAN上に存在しているのでしょうか?
はい、そのとおりです。
ただ、サーバマシンおよびアプリケーションは別会社が管理されているため、詳細が確認できません。
> 遅延が無い前提で考えるのが間違ってるような気もします
おっしゃるとおりです。。。
当方のクライアントアプリケーションとの通信では、受信処理まで毎回3~4秒の遅延が発生するのですが、フリーのSocketDebuggerFree(開発環境:Visual Studio C++ 6.0)との通信は、毎回すぐに(秒単位の遅延が発生することなしに)応答電文の受信処理が実行されています。
(両アプリとも、同じクライアントマシンにて実行しています)
そのため、プログラム上になにか問題があるような気がして質問させていただきました。
わからないことだらけで申し訳ございません。またなにかアドバイスいただければうれしいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
許せない心理テスト
私は「あなたの目の前にケーキがあります。ろうそくは何本刺さっていますか」と言われ「12本」と答えたら…
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
CAsyncSocketのOnConnectがスレッド内で反応しません
C言語・C++・C#
-
VC++2010 TCPIP通信の受信処理について
C言語・C++・C#
-
CSocketのOnReceive()
C言語・C++・C#
-
-
4
MFCとWIN32API
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C# シリアル通信でデータ受信...
-
Linuxでのシリアル通信について...
-
0byteデータの送信と受信
-
RS232C通信のC言語プログラム:...
-
【CAsyncSocket::OnReceive()呼...
-
シリアル通信 大きいサイズの...
-
再現性の無いバグ
-
シリアル通信の出力バッファと...
-
winsockでソケット通信の開発を...
-
Connection reset by peer
-
rs232cでの受信データ(mscomm)...
-
write関数でEAGAINのエラー発生...
-
ClearCommError呼び出し時のCE_...
-
Macターミナルで実行中のプログ...
-
プロダクションコードとは?
-
3のつく数字と3の倍数のみを表...
-
c言語のサイコロを100回振って...
-
バックグラウンドのプロセスの...
-
C#でのbatファイル実行結果取得
-
VBAの配列サイズとメモリに関して
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C# シリアル通信でデータ受信...
-
WriteFile()でのデータ送信がで...
-
winsockでソケット通信の開発を...
-
シリアル通信の出力バッファと...
-
Linuxでのシリアル通信について...
-
ソケット通信内 read関数について
-
シリアルポート通信
-
シリアル通信エラー
-
RS-232Cでバイナリデータを受信...
-
RS232C通信(PC⇔PLC)
-
SocketのSend関数でのCLOSEの検...
-
rs232cでの受信データ(mscomm)...
-
recv関数の受信結果について
-
socket: recvはいつ,どれだけ...
-
「スイッチングハブのバッファ...
-
SerialPortのDataReceivedイベ...
-
UDP処理のエラーについて
-
ClearCommError呼び出し時のCE_...
-
winsockの動作について。
-
waveIn、waveOutでの音声録音・...
おすすめ情報