linux—在java中通过socket.setreceivebuffersize设置值,超过os套接字缓冲区限制

e4eetjau  于 2021-07-03  发布在  Java
关注(0)|答案(0)|浏览(476)

我进行了一些测试,以了解在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”导致的错误,该设置超出了操作系统对套接字接收缓冲区大小的限制,或者实际接收的字节超出了限制,但它工作正常。我错过了什么?
编辑
我突然想到一些事。如果操作系统在内核级使用自己的缓冲区,并且操作系统的限制设置会影响缓冲区的大小,这并不意味着“一次接收的最大大小”,那么有没有办法设置一次接收的实际最大大小?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题