• 締切済み

ソケット通信の送受信遅延

MFCのCAsyncSockを使ってクライアントとサーバでメッセージの送受信をしています サーバからsend()でメッセージを送信し クライアントはOnReceive()の中でreceive()し メッセージを受信後、応答をsend()で返信します これを10msec間隔で行っているのですが ランダムに送信か受信で300msec前後の遅延が発生します なぜでしょうか? ちなみにソケットオプションで「TCP_NODELAY」を設定しています かなり困っています 気になることでも何でもいいので是非アドバイスをお願いします

みんなの回答

  • MASATO3
  • ベストアンサー率60% (27/45)
回答No.2

・輻輳が発生している(推測) ・TCPスタック内の受信バッファが一杯になってしまっている(推測) ・TCPスタック内でバッファ断片化対応など何か処理をしている(いい加減な推測) ・他のアプリケーションが何かしている(かなりいい加減な推測) など色々考えられます。 WinDumpあたりの解析ツールを使ってパケットを解析すれば、通信経路で遅延が起きているのか、それとも通信経路以外で遅延が起きているのかは絞り込めるでしょう。 でもTCPもUDPも一定時間以内に相手に届くことが保証されていないので、300msec位でしたら遅れてもなんら不思議はありませんし、何かが悪いとも思えません。普通の動作に思えます。遅延の発生を前提に設計するのが良いのではないかと思います。

sakaige32
質問者

お礼

いろいろな可能性を推測していただきありがとうございます。少し希望が見えてきました。

  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.1

遅延の頻度がわかりませんが、たまに起こる0.3秒程度の遅延を気にするということは、同一サブネットでその2台のみが接続されているor他のホストはその2台に対して全く通信していないというような状況でしょうか? ノイズもしくはハブの不良でIPレベルで再送が起こっているのではないでしょうか?ハブを交換してみるとか、クロスケーブルで直結してみるとか。 ハブは不良品で無いとしても高温とか電圧変動に弱いです。

sakaige32
質問者

補足

>遅延の頻度がわかりませんが、たまに起こる0.3秒程度の遅延を気にするということは、同一サブネットでその2台のみが接続されているor他のホストはその2台に対して全く通信していないというような状況でしょうか? P2Pでクロスケーブルで接続しています。 ノイズもしくはハブの不良でIPレベルで再送が起こっているのではないでしょうか?ハブを交換してみるとか、クロスケーブルで直結してみるとか。 ハブは不良品で無いとしても高温とか電圧変動に弱いです。

関連するQ&A

  • ソケット通信の送受信遅延-02 その後

    前回のNo.1031658 「ソケット通信の送受信遅延」に追加させてもらいます その後、プロトコルアナライザで現状調査を行い以下の現象を確認しました ◇正常時  サーバがメッセージ送信  TCPヘッダ内フラグ ACK:1, PSH:1 + 送信データあり ↓  0.2msec前後で クライアントが 返信  TCPヘッダ内フラグ ACK:1, PSH:1 + 返信データあり ↓  10msecで サーバが送信  TCPヘッダ内フラグ ACK:1, PSH:1 + 送信データあり ↓  0.2msec前後で クライアントが 返信  TCPヘッダ内フラグ ACK:1, PSH:1 + 返信データあり ↓          以下繰り返り ◇不具合時  サーバがメッセージ送信  TCPヘッダ内フラグ ACK:1, PSH:1 + 送信データあり ↓  0.2msec前後で クライアントが 返信  TCPヘッダ内フラグ ACK:1, PSH:1 + 返信データあり ↓  10msecで サーバが送信  TCPヘッダ内フラグ ACK:1, PSH:1 + 送信データあり ↓  約130msec前後で クライアントが 返信  TCPヘッダ内フラグ ACK:1, PSH:0 + 返信データなし ↓  約250msec前後で クライアントが 返信  TCPヘッダ内フラグ ACK:1, PSH:1 + 返信データあり ↓ といった状況です どう解釈すれば良いのでしょうか 遅延の原因はソケットなのかそれ以外なのでしょうか?是非アドバイスをおねがいします。

  • vb2010でソケット通信を使いたいのですが

    はじめまして。 vb2010でソケット通信を使いたくて、今TCPサーバーを作っています。 クライアント側から受信した瞬間にサーバー側から返信というのは可能でしょうか。 受信したタイミングで接続が切れてしまって困っています。 初めてソケット通信に触れてイマイチ分かってないので説明がうまくいきませんが、 どなたかわかる方がいらっしゃいましたらご回答よろしくお願いします。

  • ソケットを使ったTCP通信

    はじめまして. 最近ネットワークの勉強を始めた学生です. ソケットを使ったTCP通信について質問させてください. クライアント側はsocket(), connect()でコネクションを確立した後に何回か連続してsend(), recv()を行いたいのに,サーバ側がファイアウォールや侵入検知システムを使って途中で通信を終了するようにしてしまっている場合,クライアント側は再びコネクションを確立させなければ全てのsend()を行うことはできないのでしょうか? よろしくお願いします.

  • ソケット通信の受信サイズ

    MFC VC++6.0で、ソケット通信を勉強しています。 サーバー側を http://athomejp.com/goldfish/mfc/socket/socketserver.asp を参考に「ソケットから何かを受信する」ところの 配列サイズとwhileの条件を char szBuf[1024]; while( nret != 0 ) に変更しました。 クライアントからは64バイトの送信をしているのですが、 サーバでReceiveしたサイズが16バイトで、whileを抜けてしまいます。 何が原因でしょうか、ご教示ください。 お願いいたします。

  • VC++ 6.0 のソケット通信について

    VC++6.0にてソケット通信プログラムを作成中(学習中)なのですが 以下のようなソケットのやり取りを想定しています。 A→B→C A←B←C 分かりづらいかもしれませんが、A,B,C三つのプログラムがあり まず、AはBに向けて電文を送信、Bはそれを受信し、Cに電文を送信 Cはそれに対してBへ電文を送信、BはCからの電文を受信しAへ電文を送信 こんな感じになっています。いうなればA,C間の中継器のような役割をBに持たせたいのです。 http://blog.livedoor.jp/akf0/archives/51585502.html ここのソースなどを参考にしてBのプログラムを組んでいるのですが サーバとクライアントでソースが分かれています。 Bはサーバもクライアントも兼ねるような仕様なのですが、この場合に使用するソケットは (1)Aからの受信を行う(待つ)ソケット (2)Cへ送信を行うソケット (3)Cからの受信を行う(待つ)ソケット (4)Aへ送信を行うソケット の4つのソケットが必要になるのでしょうか? ソケットの仕組みがうまく理解できていないので頓珍漢な質問かもしれませんが 回答よろしくお願いします。

  • ソケット通信について

    こんにちは。初心者開発者です。 .NetでPDAをクライアントにしたクライアントサーバー型の処理を現在開発しております。 【環境】 場所:台湾 クラアント:Windows CE5.0 サーバー:WindowsXP 中国語版 無線LANアクセスポイント:ASUS RT-G32 【現象】 ソケット通信自体はできたのですが、いくつかの疑問点があります。 (1)無線LANポイントの機種によってPDAとソケット通信してる間しかPingが通らない。  PCからPDAのPingが通らない状況で、ソケット通信が始まるとPingが通る状態になります。 (2)(1)の無線LANポイントだとPDAでのレシーブ時のポーリングが永久にレシーブOKの状態にならない。  無線LANのソケット通信の立ち上がりを検出できないのか、初回のポーリングが永久にOKにならない事が多いです。  ソケットをシャットダウンしてクローズした後に再処理した時に上手くいくことが多いです。 (3)70k程度の通信に10秒以上かかることがあります。サーバーがセンドしてからクラアントがレシーブするまで。  ソケット通信だと大体こんなかかるものなのでしょうか? 【質問】 (1)(2)の現象に関しては、台湾の業務で導入をしていますが、現地で購入できる無線LANでお勧めの物があれば教えていただければと思います。 後、通信中でなくても常にPingが通る状態というのは何かそれようの設定があるのか、心当たりがあったら教えていただければと思います。 (3)自分初めてソケット通信プログラムを作りますので大体の所感が分かりません。  宜しかったら、それだと絶望的に遅いから何かを見直した方がいいとかアドバイスいただければと思います。 よろしくお願いいたします。

  • ソケット通信の送受信方法

    ソケット通信を用いて、簡単な通信ゲームを作成しようと思っています。 メッセージ送信時に構造体を送りたいと思っているのですが どう指定してもエラーになってしまい、作業が止まってしまっています。 下記の様な指定の仕方ですと、エラーは起きないのですが・・・ char buf[256] = { 0 }; send(clsock,buf,256,0); typedef struct{ int a; int b; }sample; 上記のような構造体を送信、受信する場合は、どのように指定すれば良いのでしょうか? 知っている方いましたらご教授お願いします。

  • ソケットでのデータ送受信について教えてください

    はじめまして。 Perlでのソケット通信プログラムで質問があります。 現在ソケットで通信を行うテストプログラムを作っているのですが、 クライアントからサーバへの片方向送信は出来るのですが、 クライアントからデータ受信後、サーバからクライアントへ応答を 返す処理が上手くいきません。 私としては、クライアントとサーバの処理を逆にすればよいだけかな と思っているのですが認識違いでしょうか? 宜しくお願いします。 環境 OS:Linux 言語:Perl5.8 ■上手くいく場合(かなり省略します。ポイントだけ) サーバ側 $client=accept(C_SOCKET, P_SOCKET); while(<C_SOCKET>){ printf("%s",$_); #受信データ } クライアント側 socket (SOCKET, PF_INET, SOCK_STREAM, 0); connect(SOCKET, pack_sockaddr_in(9000,$ipaddr_bin)); print SOCKET "Test Data!!\n"; →サーバ側端末にTest Data!!と表示 ■送受信しようとしてダメなもの サーバ側 $client=accept(C_SOCKET, P_SOCKET); while(<C_SOCKET>){ printf("%s",$_); #受信データ } print C_SOCKET "Return Data!!\n"; クライアント側 socket (SOCKET, PF_INET, SOCK_STREAM, 0); connect(SOCKET, pack_sockaddr_in(9000,$ipaddr_bin)); print SOCKET "Test Data!!\n"; while(<SOCKET>){ printf("%s",$_); #応答データ } →サーバ側にはTest Data!!すら表示されない。  もちろんクライアント側にも。

    • ベストアンサー
    • Perl
  • 一般的なソケット通信プログラム

    ソケットを用いてシステムを考えておりまして、設計に悩んでおります。まだ知識がないもので、情報をいただければと思っております。 まず基本的にはサーバ1に対してクライアントはN台を考えております。サーバからクライアントに対して、メッセージを送信し、それに応じてクライアントで処理を行います。メッセージ数(クライアントの処理の数)は今のところ3種類を考えてます。 そこで、一般的にはどのようにするのが普通なのかということをまず知りたいのですが、これだけで何か情報をいただけないでしょうか。 いろいろ情報をいただければと思っております。よろしくお願いします。

  • ソケット通信について

    自分はJAVAで、クライアント・サーバ形式の ネットワークゲームを作ろうとしているのですが、 チャットシステムで BufferedReader NetInput; // ネットワーク経由入力ストリーム PrintStream NetOutput; // ネットワーク経由出力ストリーム Socket socket; // ソケット ChatServer chatserver; // ChatServerオブジェクト int clientnumber; // クライアント番号 ChatClient(Socket socket, ChatServer chatserver, int clientnumber) { this.socket = socket; this.chatserver = chatserver; this.clientnumber = clientnumber; try { InputStream inputstream = socket.getInputStream( ); NetInput = new BufferedReader(new InputStreamReader(inputstream)); OutputStream outputstream = socket.getOutputStream( ); NetOutput = new PrintStream(outputstream); } catch(Exception e) { System.out.println("->" + e); } } // メッセージ送信 ------------------------ synchronized void sendMessage(String message) { NetOutput.println(message); // サーバからクライアントに送信 NetOutput.flush( ); } とString型の文字列messageを送受信し合う様に、 int型の配列や、boolean型の配列を送受信する方法があったら 教えていただきたいです。

専門家に質問してみよう