3

初めての c/c++ アプリケーションを開発し、ソケットを使用しています。このアプリケーションはサーバーに接続し、サーバーから送信された画像データを読み取ります。画像データの前には、読み取るデータ量などの重要な int がいくつかあります。

データが利用可能になるまでブロックするオプションがあった場合、スレッドを継続的にループさせる方が良いとは思わなかったため、アプリケーションはブロックソケットを使用しています。

私の問題は、サーバーがネットワークへの接続を失っただけで、アプリケーションがそこに座っているだけで、ユーザーへの通知をトリガーしたり、再接続を試みたりする方法がないことです。接続状態の確認方法がわかりません。

誰かが私の問題を解決する方法について少しアドバイスをくれませんか?

ありがとうございました。ソケットからの読み取り方法を示す readImageInt() 関数を貼り付けました。Linuxデバイスを使用して開発しています。

int readImageInt()
{

int nb, i;
union {
    long int whole;
    char bytes[4];
} v;
memset(v.bytes, 0x00, 4);
nb = recv(imagesock, v.bytes, 4, MSG_WAITALL);
if (nb == 0||nb == -1)
 {

    return -1;
 }
else
    {
    v.whole = ntohl(v.whole);

     return v.whole;
    }

}
4

2 に答える 2

1

ソケット オプションを設定して、長いブロッキング受信操作から抜け出すことができます。SO_RCVTIMEO

編集 0:

select(2)または、poll(2)(またはLinux を使用している場合)のようなポーリング呼び出しをepoll_wait(2)タイムアウト付きで使用することもできます。これにより、カーネル内の待機から抜け出し、たとえば、待機を続行するか保釈するかを示すユーザー入力を確認できます。

ただし、切断された接続を検出するより信頼性の高い方法は、相手側がサポートしている場合にデータを送信することです。シグナルまたはエラーが返されます (ただし、クラッシュしたリモート エンドでは数分かかる場合があります)。

編集1:

を見てみましょうselect_tut(2)

于 2012-12-18T18:48:10.703 に答える
0

データを受信する前に、select 関数を使用してソケットの状態を確認することを検討してください。たとえば、ここを参照してください http://support.sas.com/documentation/onlinedoc/sasc/doc750/html/lr2/select.htm

于 2012-12-18T19:02:54.500 に答える