0

Comer 著、TCP/IP Vol III を使用したインターネットワーキングを読んでいる最中です。

UDP の「TIME」クライアントのサンプル コードを見ています。

コードは応答の読み取りを行うポイントに到達し、4 バイトであるべきものを取り、それを 32 ビットの符号なし整数に変換するため、UNIX 時間に変換できます。

「n」は、UDP をリッスンするソケットを指すファイル記述子です。

n = read (s, (char *)&now, sizeof(now));
if (n < 0)
    errexit("read failed: %s\n", strerror(errno));
now = ntohl((u_long)now);   /* put in host byte order */

私が疑問に思っているのは:

変換を行う前に確認すべきいくつかの仮定はありますか? これは C であり、read が 4 以外のバイト数を渡す状況があるかどうか疑問に思っています。

「今」は次のように定義されます。

time_t   now;    /* 32-bit integer to hold time */

したがって、「time_t」の性質、Cでバイトがどのように渡されるのか、またはUDPがファイル記述子に間違ったバイト数を返す状況を理解していない可能性があります...

前もって感謝します。

4

1 に答える 1

1

UDP では、渡す受信バッファーがread十分に長い限り、1 つの UDP パケットがread呼び出し間で分割されることはありません。

ただし、相手側が少なくとも 4 バイトのパケットを送信したという保証はありません。サーバーが 2 バイトの応答のみを送信した場合、そのコードはnowゴミを含んだままになります。

それはおそらく、この正確な状況ではあまり重要ではありません。結局のところ、サーバーは、2 バイトだけを送信するのと同じように、4 バイトのガベージを送信してもかまいません。それを確認したい場合は、n返された byreadが期待どおりの長さであることを確認してください。

于 2009-09-25T00:10:16.807 に答える