我正在阅读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会将错误的字节数返回给文件描述符的情况......
提前致谢。
答案 0 :(得分:1)
使用UDP,只要传递给read
的接收缓冲区足够长,就不会在read
次呼叫之间分解单个UDP数据包。
但是,并不能保证对方发送了至少4个字节的数据包 - 如果服务器只发送了2个字节的响应,那么这个代码将会使now
包含垃圾,这是非常正确的。 / p>
在这种精确的情况下,这可能无关紧要 - 毕竟,服务器可以自由发送4个字节的垃圾,因为它只发送2个字节。如果您想检查它,只需检查n
返回的read
是否与您期望的一样长。