質問者
TCPIP送信可能判定について

質問
-
TCPIP通信アプリケーションを作成しています。
対向機であるサーバ(カメラ)と通信し、リアルタイム画像をUDP通信で取得しながら(作成アプリはUDP受信のみで送信はしません。)、
カメラを遠隔コントロールするため、HTTP通信(TCP通信)も並行して行っています。この際、HTTP通信内でselect関数を使用し、
送信可能な状態であるかどうかを判定し、送信処理(send関数のコール)を行っています。
このとき、select関数から戻される値が送信可能であることを示す値を返さず、タイムアウトが発生します。タイムアウト発生時には再度selectするようにしているのですが、何度もタイムアウトとなったまま、送信可能状態とならない状況が発生します。
このような状況から送信可能状態へ復帰させるにはどのようにすればよいでしょうか?selectに指定しているタイムアウト値は数秒を設定しています。
すべての返信
-
-
フォーラム オペレーターの星 睦美です。tama1976 さん、こんにちは。
質問の状況は解決できましたでしょうか。佐祐理 さんの返信内容がトラブルシューティングの手がかりになれば幸いです。私から[回答としてマーク] させていただきました。もしフォーラムでさらに質問を続けたい場合には[回答としてのマークの解除] ができます。事象を再現可能なコードを追記いただくとフォーラム ユーザーも具体的なアドバイスができるのではないかと思います。
それではこれからもMSDN フォーラムをお役立てください。フォーラム オペレーター 星 睦美 - MSDN Community Support
-
初回は送信できているのでしょうか? というのも、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);
}
}