2

次のコードが常に 0 を返す理由を教えてください。ソケット記述子の値は 3 です。オープンな SUSE TFTP サーバーを使用しています。これは、ローカル ホストのポート 69 でリッスンしています。

connect() 関数は成功を返します ..

   connection_timer.tv_sec = 2; // s
    connection_timer.tv_usec = 0; 

 FD_ZERO(&fd_reader);
    // laukiam, kol bus ka nuskaityti
    FD_SET(socket_descriptor, &fd_reader);

    int select_ready = select(socket_descriptor + 1, &fd_reader, NULL, NULL, &connection_timer); 

TCPdump を使用してパケットをチェックすると、最初のパケットが送信され、Ack を受信する前にどこかで接続が閉じられます。

4

3 に答える 3

2

記述子が興味深いものになる前に、タイマー(この例では)が期限切れになるというリターンコードを取得0します。selectconnection_timer

だから、それはエラーではありません。正しく初期化されていないconnection_timer可能性が高いです。

于 2011-08-21T13:01:25.753 に答える
1

WSAStartup 関数を呼び出す必要があります。私は同じ問題を抱えており、このスタートアップ関数を呼び出した後に解決しました。

于 2012-04-25T17:59:19.077 に答える
1

connect()接続された宛先からのデータグラムのみを受け入れるようにしたUDPソケットで使用したため、応答を受信して​​いないと思われます。

TFTP 応答はポート 69 からではなく、エフェメラル ポートから送信されるため、確認応答は受信されません。

connect()解決策:最初の接続が完了するまで、UDP ソケットを使用しないでください。

于 2011-08-21T19:05:12.890 に答える