0

我正在阅读 Comer 的 Internetworking with 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足够长,单个 UDP 数据包就不会在read调用之间被分解。

但是,不能保证对方发送了至少 4 个字节的数据包 - 你说得对,如果服务器只发送 2 个字节的响应,那么该代码将now包含垃圾。

在这种精确的情况下,这可能并不重要——毕竟,服务器发送 4 个字节的垃圾就像只发送 2 个字节一样自由。如果您想检查它,只需检查n返回的 byread是否与您期望的一样长。

于 2009-09-25T00:10:16.807 回答