Java:为什么 DatagramSocket 的“receive”方法会截断消息?

发布于 2024-10-16 07:05:45 字数 278 浏览 1 评论 0原文

来自 C socket()/recv() 背景,Java DatagramSocket.receive API 看起来有点奇怪。为什么强制程序员为传入数据分配足够大的 DatagramPacket ?

Coming from a C socket()/recv() background, the Java DatagramSocket.receive API seems a bit strange. Why does force the programmer to allocate a DatagramPacket large enough for the incoming data?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

戏蝶舞 2024-10-23 07:05:45

这个问题是基于一个错误的前提。在 C 中,recv 系统调用的签名是:

ssize_t recv(int s, void *buf, size_t len, int flags);

请注意,您传递了一个指向缓冲区的指针以及该缓冲区的长度。手动输入然后说:

如果消息太长,无法放入所提供的缓冲区,则可能会丢弃多余的字节,具体取决于接收消息的套接字类型。

换句话说,C API 期望调用者分配一个“足够大”的缓冲区,并且可能截断较长的消息……就像 Java 所做的那样。

This question is based on a false premise. In C, the signature for the recv syscall is:

ssize_t recv(int s, void *buf, size_t len, int flags);

Note that you pass a pointer to a buffer, and the length of that buffer. The manual entry then says:

If a message is too long to fit in the supplied buffer, excess bytes may be discarded depending on the type of socket the message is received from.

In other words, the C API expects the caller to allocate a "large enough" buffer, and may truncate messages that are longer ... just like Java does.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文