Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:为什么DatagramSocket';s'receive'方法是否截断消息?_Java_Udp - Fatal编程技术网

Java:为什么DatagramSocket';s'receive'方法是否截断消息?

Java:为什么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); 请注意,您传递了一个指向缓冲区的指针,以及该缓冲区的长度。然后,手动输入显示: 如果消息太长,无法放入提供的缓冲区,则可能会丢弃多余的字节,具体取决于从中接收消息的套接字类型 换句话说

来自C
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
时返回它是不明智的,一个快速的实验证明了这一点。谢谢你的帮助。