我进行了一些测试,以了解在linux中,当给定的大小超过套接字缓冲区限制时,JavaSocket.setreceivebuffersize(int-size)是如何工作的。
我将以下配置设置为/etc/sysctl.conf:
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_wmem = 4096 12582912 16777216
net.ipv4.tcp_rmem = 4096 12582912 16777216
我的简单接收器测试代码如下:
ServerSocket socket = new ServerSocket(myport);
socket.setReceiveBufferSize(26777216);
System.out.println("Listening...");
Socket.client = socket.accept();
System.out.println("accepted!");
System.out.println("client.getReceiveBufferSize: " + client.getReceiveBufferSize());
try (InputStream in = client.getInputStream();) {
byte[] input = in.readAllBytes();
System.out.println("input length: " + input.length);
} catch (Exception e) {
e.printStackTrace();
} finally {
socket.close();
}
System.out.println("DONE");
我的发送者测试代码如下:
Socket so = new Socket(testhost, testport);
so.setSendBufferSize(99999999);
try (OutputStream out = so.getOutputStream();) {
byte[] b = new byte[99999999];
Arrays.fill(b, (byte)1);
out.write(b);
out.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
so.close();
}
测试输出:
Listening...
accepted!
client.getReceiveBufferSize: 16777216
input length: 99999999
DONE
我预计会出现类似于设置“26777216”导致的错误,该设置超出了操作系统对套接字接收缓冲区大小的限制,或者实际接收的字节超出了限制,但它工作正常。我错过了什么?
编辑
我突然想到一些事。如果操作系统在内核级使用自己的缓冲区,并且操作系统的限制设置会影响缓冲区的大小,这并不意味着“一次接收的最大大小”,那么有没有办法设置一次接收的实际最大大小?
暂无答案!
目前还没有任何答案,快来回答吧!