Java:为什么DatagramSocket';s'receive'方法是否截断消息?
来自CJava:为什么DatagramSocket';s'receive'方法是否截断消息?,java,udp,Java,Udp,来自Csocket()/recv()背景的Java API似乎有点奇怪。为什么要强迫程序员分配一个足够大的数据包来容纳传入的数据?这个问题基于一个错误的前提。在C语言中,recvsyscall的签名是: ssize_t recv(int s, void *buf, size_t len, int flags); 请注意,您传递了一个指向缓冲区的指针,以及该缓冲区的长度。然后,手动输入显示: 如果消息太长,无法放入提供的缓冲区,则可能会丢弃多余的字节,具体取决于从中接收消息的套接字类型 换句话说
socket()
/recv()
背景的Java API似乎有点奇怪。为什么要强迫程序员分配一个足够大的数据包来容纳传入的数据?这个问题基于一个错误的前提。在C语言中,recv
syscall的签名是:
ssize_t recv(int s, void *buf, size_t len, int flags);
请注意,您传递了一个指向缓冲区的指针,以及该缓冲区的长度。然后,手动输入显示:
如果消息太长,无法放入提供的缓冲区,则可能会丢弃多余的字节,具体取决于从中接收消息的套接字类型
换句话说,C API期望调用方分配一个“足够大”的缓冲区,并可能截断较长的消息。。。就像Java一样。这个问题基于一个错误的前提。在C语言中,recv
syscall的签名是:
ssize_t recv(int s, void *buf, size_t len, int flags);
请注意,您传递了一个指向缓冲区的指针,以及该缓冲区的长度。然后,手动输入显示:
如果消息太长,无法放入提供的缓冲区,则可能会丢弃多余的字节,具体取决于从中接收消息的套接字类型
换句话说,C API期望调用方分配一个“足够大”的缓冲区,并可能截断较长的消息。。。就像Java一样。那么,C中的行为是什么呢?这是一个好问题……到目前为止,我一直认为recvfrom
将继续返回剩余的数据,但实验证明我错了。请参阅对@Stephen C答案的评论。那么,C中的行为是什么?这是一个好问题……到目前为止,我一直认为recvfrom
将继续返回剩余的数据,但实验证明我错了。请参阅对@Stephen C答案的评论。因此,我的系统手册页没有明确说明多余字节将在何时被丢弃……但经过反思,这是有意义的,因为UDP不是流式传输,尝试存储数据报的未读部分并在下一次调用recvfrom
时返回它是不明智的,一个快速的实验证明了这一点。谢谢你的帮助。所以,我的系统手册页并没有明确说明多余的字节何时会被丢弃……但经过反思,这是有意义的,因为UDP不是流式传输,尝试存储数据报的未读部分并在下一次调用recvfrom
时返回它是不明智的,一个快速的实验证明了这一点。谢谢你的帮助。