代码之家  ›  专栏  ›  技术社区  ›  benc

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

  •  0
  • benc  · 技术社区  · 16 年前

    我正在阅读InternetWorking with TCP/IP Vol III,作者是Comer。

    我正在为UDP的“时间”客户端寻找一些示例代码。

    代码到达读取响应的位置,它需要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 */
    

    所以我可能不理解“时间”的性质,或者字节是如何在C中传递的,或者UDP会在什么情况下向文件描述符返回错误的字节数…

    事先谢谢。

    1 回复  |  直到 16 年前
        1
  •  1
  •   caf    16 年前

    使用udp,只要传递到接收缓冲区 read 足够长,一个UDP包不会在 阅读 电话。

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

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