在转换之前,“TIME服务的UDP客户端”是否需要检查读取数据的长度?

时间:2009-09-24 18:39:26

标签: c udpclient

我正在阅读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中,我想知道是否存在读取将传递不是4的字节数的情况。如果是这样,似乎“现在”将是一团糟。

“现在”定义为:

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

所以也许我不明白“time_t”的性质,或者字节在C中传递的方式,或者UDP会将错误的字节数返回给文件描述符的情况......

提前致谢。

1 个答案:

答案 0 :(得分:1)

使用UDP,只要传递给read的接收缓冲区足够长,就不会在read次呼叫之间分解单个UDP数据包。

但是,并不能保证对方发送了至少4个字节的数据包 - 如果服务器只发送了2个字节的响应,那么这个代码将会使now包含垃圾,这是非常正确的。 / p>

在这种精确的情况下,这可能无关紧要 - 毕竟,服务器可以自由发送4个字节的垃圾,因为它只发送2个字节。如果您想检查它,只需检查n返回的read是否与您期望的一样长。