none
TCPIP送信可能判定について RRS feed

  • 質問

  • TCPIP通信アプリケーションを作成しています。

    対向機であるサーバ(カメラ)と通信し、リアルタイム画像をUDP通信で取得しながら(作成アプリはUDP受信のみで送信はしません。)、

    カメラを遠隔コントロールするため、HTTP通信(TCP通信)も並行して行っています。この際、HTTP通信内でselect関数を使用し、

    送信可能な状態であるかどうかを判定し、送信処理(send関数のコール)を行っています。

    このとき、select関数から戻される値が送信可能であることを示す値を返さず、タイムアウトが発生します。タイムアウト発生時には再度selectするようにしているのですが、何度もタイムアウトとなったまま、送信可能状態とならない状況が発生します。

    このような状況から送信可能状態へ復帰させるにはどのようにすればよいでしょうか?selectに指定しているタイムアウト値は数秒を設定しています。

    2015年8月20日 5:30

すべての返信

  • 初回は送信できているのでしょうか? というのも、send()はOSのバッファに書き込むだけであり、サーバーへの送信完了を保証するものではないため、当然ながら接続完了していればとりあえず初回は送信可能なはずです。

    何にせよ、具体的なコードを挙げていただいた方が原因を特定しやすいと思います。

    • 回答の候補に設定 星 睦美 2015年8月26日 4:18
    • 回答としてマーク 星 睦美 2015年9月3日 5:16
    • 回答としてマークされていない tama1976 2015年9月10日 9:53
    • 回答の候補の設定解除 星 睦美 2015年9月16日 2:53
    2015年8月20日 6:23
  • フォーラム オペレーターの星 睦美です。tama1976 さん、こんにちは。

    質問の状況は解決できましたでしょうか。佐祐理 さんの返信内容がトラブルシューティングの手がかりになれば幸いです。私から[回答としてマーク] させていただきました。

    もしフォーラムでさらに質問を続けたい場合には[回答としてのマークの解除] ができます。事象を再現可能なコードを追記いただくとフォーラム ユーザーも具体的なアドバイスができるのではないかと思います。
    それではこれからもMSDN フォーラムをお役立てください。


    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2015年9月3日 4:41
  • 初回は送信できているのでしょうか? というのも、send()はOSのバッファに書き込むだけであり、サーバーへの送信完了を保証するものではないため、当然ながら接続完了していればとりあえず初回は送信可能なはずです。

    何にせよ、具体的なコードを挙げていただいた方が原因を特定しやすいと思います。

    ご返信が遅くなり大変申し訳ございません。初回の送信は行えています。
    送信している部分のコードは下記になります。下記のcontinuteしている部分が繰り返される状態です。
    下記は送信の場合のコードですが、受信の場合でもselect関数がタイムアウトを続ける状態が発生します。
    受信時の動作として、Wiresharkによるパケットキャプチャ上では送信プログラムが送っているデータが
    受信されていることを確認していますが、selectはタイムアウトを続ける状態です。

         while(1)
         {

                nSocketEvents = select((HttpSocket + 1), 0, 
                    &pConnection->FDWrite,
                    &pConnection->FDError,
                    &Timeval);

                if(nSocketEvents < 0)

                {
                   *(nLength) = 0;
                    break; 
                }

                if(nSocketEvents == 0) // No new events so

                {
                    continue; // restart this loop
                }

                if(FD_ISSET(pConnection->HttpSocket ,&pConnection->FDWrite))
                {
                   nRetCode = send(HttpSocket,pData,*(nLength),0);  
                }

        }

    2015年9月10日 10:04
  • select()はfs_set(pConnection->FDWriteとpConnection->FDError)を書き換えますので呼び出し前に毎回再設定が必要です。その処理は成されていますでしょうか?
    2015年9月10日 11:34
  • コードの記載がもれていました。大変申し訳ありません。

    select関数の直前にてfd_setをコールしています。

    2015年9月10日 11:58
  • まぁそんな感じで、書かれていない部分に問題があるんじゃないでしょうか?
    2015年9月10日 13:03
  • ありがとうございました。
    2015年9月11日 11:42