爲什麼在設置套接字發送/接收緩衝區大小高於sysctl max時沒有錯誤(如下面所示)? 「預期的行爲」沒有錯誤?爲什麼在設置套接字發送/接收緩衝區大小高於sysctl max時沒有錯誤?
我sysctl
值插座rmem_max
和wmem_max
都設置爲212992:
net.core.rmem_default = 212992
net.core.rmem_max = 212992
net.core.wmem_default = 212992
net.core.wmem_max = 212992
net.ipv4.tcp_rmem = 4096 87380 6291456
net.ipv4.tcp_wmem = 4096 16384 4194304
net.ipv4.udp_rmem_min = 4096
net.ipv4.udp_wmem_min = 4096
vm.lowmem_reserve_ratio = 256 256 32
當我創建一個套接字,並嘗試套接字緩衝區的大小爲64 * 1024 * 1024(一值比rmem_max
和wmem_max
更高版本),同時發送/接收:
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <boost/asio.hpp>
#include <boost/format.hpp>
using boost::asio::ip::udp;
using boost::format;
using namespace std;
int main()
{
try
{
boost::asio::io_service io_service;
udp::socket socket(io_service, udp::endpoint(udp::v4(), 0));
udp::resolver resolver(io_service);
udp::resolver::query query(udp::v4(), "localhost", "7770");
udp::resolver::iterator iterator = resolver.resolve(query);
boost::system::error_code error_code;
socket.set_option(boost::asio::socket_base::send_buffer_size(64*1024*1024), error_code);
cout << error_code << endl;
boost::asio::socket_base::send_buffer_size send_buffer_size;
socket.get_option(send_buffer_size);
cout << format("send_buffer_size=%s") % send_buffer_size.value() << endl;
socket.set_option(boost::asio::socket_base::receive_buffer_size(64*1024*1024), error_code);
cout << error_code << endl;
boost::asio::socket_base::receive_buffer_size receive_buffer_size;
socket.get_option(receive_buffer_size);
cout << format("receive_buffer_size=%s") % receive_buffer_size.value() << endl;
}
catch (std::exception& e)
{
std::cerr << "Exception: " << e.what() << "\n";
}
return 0;
}
我期待看到一個錯誤,而是我沒有得到任何錯誤:
system:0
send_buffer_size=212992
system:0
receive_buffer_size=212992
如果設置緩衝區大小不報告的錯誤是「預期的行爲」爲setsockopt()
,我想適當的代碼是請在致電setsockopt()
後檢查數值,並提出我自己的錯誤或警告。
這些選項的行爲不是標準化的。您必須實施針對您支持的每個平臺的行爲。令人感到奇怪的是,有些平臺幾乎不會讀回您設置的相同尺寸,因爲他們測量的尺寸與他們設置的方式不同。 –
我一直都知道,雖然現在不能找到它的寫入位置,但系統可以調整您指定的大小,並且需要調用'getsockopt()'來查明實際的分配情況。 – EJP