读取 Windows UDP 缓冲区大小
Read Windows UDP Buffer Size
我发现很难弄清楚如何通过命令提示符检查 Windows 中的 UDP 缓冲区大小。我正在寻找类似于 linux 命令“sysctl net.core.rmem_max”的东西。我不需要设置 UDP 缓冲区大小,我只需要检查它以便在它小于我推荐的大小时发出警告。到目前为止,我似乎在每个地方都指向通过 Windows 注册表设置缓冲区大小。有谁知道通过命令提示符或 C++ 简单地检查缓冲区大小的可能方法吗?
我不知道如何从命令行执行此操作(看起来 PowerShell 可以做到),但您应该能够按如下方式在 C++ 中执行此操作(注意:未经测试):
#include <iostream>
#include <WinSock2.h>
#include <Ws2tcpip.h>
#pragma comment (lib, "Ws2_32.lib")
int main ()
{
WSADATA wsaData;
int err = WSAStartup (MAKEWORD (2, 2), &wsaData);
if (err != NO_ERROR)
{
std::cerr << "WSAStartup failed with error " << err << "\n";
return 1;
}
SOCKET s = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (s == INVALID_SOCKET)
{
std::cerr << "socket failed with error " << WSAGetLastError () << "\n"
return 1;
}
int rcvbuf_len;
socklen_t optlen = sizeof (rcvbuf_len);
if (getsockopt (s, SOL_SOCKET, SO_RCVBUF, &rcvbuf_len, &optlen) < 0)
{
std::cerr << "getsockopt failed with error " << WSAGetLastError () << "\n";
return 1;
}
std::cout << "UDP receive buffer length = " << rcvbuf_len << " bytes\n");
}
我们不需要在这里清理任何资源,因为程序退出时会自动清理。
我使用了@Paul Sanders的代码,并根据getsockopt
函数和socket
函数的官方文档(可以找到here for getsockopt and here for socket)添加了一些修改,修正了一些小问题详细信息并将其编译为
g++ get_buff_size.cpp -o get_buff_size.exe -lwsock32
我用它仔细检查了 MS 文档中关于 DefaultReceiveWindow 参数的信息,并试图弄清楚 DefaultReceiveWindow
是否适用于 TCP 和 UDP。
这是对我有用的代码:
#include <iostream>
#include <WinSock2.h>
#include <Ws2tcpip.h>
int main()
{
int optVal;
int optLen = sizeof(int);
WSADATA wsaData;
int err = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (err != NO_ERROR)
{
printf("WSAStartup failed with error %d\n", err);
return 1;
}
SOCKET listenSocketTCP = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (listenSocketTCP == INVALID_SOCKET)
{
printf("socket failed with error %d\n", WSAGetLastError());
return 1;
}
SOCKET listenSocketUDP = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (listenSocketUDP == INVALID_SOCKET)
{
printf("socket failed with error %d\n", WSAGetLastError());
return 1;
}
if (getsockopt(listenSocketTCP, SOL_SOCKET, SO_RCVBUF, (char *)&optVal, &optLen) != SOCKET_ERROR)
{
printf("TCP SO_RCVBUF Value: %d\n", optVal);
}
else
{
printf("TCP SO_RCVBUF getsockopt failed with error %d\n", WSAGetLastError());
return 1;
}
if (getsockopt(listenSocketTCP, SOL_SOCKET, SO_SNDBUF, (char *)&optVal, &optLen) != SOCKET_ERROR)
{
printf("TCP SO_SNDBUF Value: %d\n", optVal);
}
else
{
printf("TCP SO_SNDBUF getsockopt failed with error %d\n", WSAGetLastError());
return 1;
}
if (getsockopt(listenSocketUDP, SOL_SOCKET, SO_RCVBUF, (char *)&optVal, &optLen) != SOCKET_ERROR)
{
printf("UDP SO_RCVBUF Value: %d\n", optVal);
}
else
{
printf("UDP SO_RCVBUF getsockopt failed with error %d\n", WSAGetLastError());
return 1;
}
if (getsockopt(listenSocketUDP, SOL_SOCKET, SO_SNDBUF, (char *)&optVal, &optLen) != SOCKET_ERROR)
{
printf("UDP SO_SNDBUF Value: %d\n", optVal);
}
else
{
printf("UDP SO_SNDBUF getsockopt failed with error %d\n", WSAGetLastError());
return 1;
}
return 0;
}
你应该期待这样的输出:
TCP SO_RCVBUF Value: 65536
TCP SO_SNDBUF Value: 65536
UDP SO_RCVBUF Value: 65536
UDP SO_SNDBUF Value: 65536
我发现很难弄清楚如何通过命令提示符检查 Windows 中的 UDP 缓冲区大小。我正在寻找类似于 linux 命令“sysctl net.core.rmem_max”的东西。我不需要设置 UDP 缓冲区大小,我只需要检查它以便在它小于我推荐的大小时发出警告。到目前为止,我似乎在每个地方都指向通过 Windows 注册表设置缓冲区大小。有谁知道通过命令提示符或 C++ 简单地检查缓冲区大小的可能方法吗?
我不知道如何从命令行执行此操作(看起来 PowerShell 可以做到),但您应该能够按如下方式在 C++ 中执行此操作(注意:未经测试):
#include <iostream>
#include <WinSock2.h>
#include <Ws2tcpip.h>
#pragma comment (lib, "Ws2_32.lib")
int main ()
{
WSADATA wsaData;
int err = WSAStartup (MAKEWORD (2, 2), &wsaData);
if (err != NO_ERROR)
{
std::cerr << "WSAStartup failed with error " << err << "\n";
return 1;
}
SOCKET s = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (s == INVALID_SOCKET)
{
std::cerr << "socket failed with error " << WSAGetLastError () << "\n"
return 1;
}
int rcvbuf_len;
socklen_t optlen = sizeof (rcvbuf_len);
if (getsockopt (s, SOL_SOCKET, SO_RCVBUF, &rcvbuf_len, &optlen) < 0)
{
std::cerr << "getsockopt failed with error " << WSAGetLastError () << "\n";
return 1;
}
std::cout << "UDP receive buffer length = " << rcvbuf_len << " bytes\n");
}
我们不需要在这里清理任何资源,因为程序退出时会自动清理。
我使用了@Paul Sanders的代码,并根据getsockopt
函数和socket
函数的官方文档(可以找到here for getsockopt and here for socket)添加了一些修改,修正了一些小问题详细信息并将其编译为
g++ get_buff_size.cpp -o get_buff_size.exe -lwsock32
我用它仔细检查了 MS 文档中关于 DefaultReceiveWindow 参数的信息,并试图弄清楚 DefaultReceiveWindow
是否适用于 TCP 和 UDP。
这是对我有用的代码:
#include <iostream>
#include <WinSock2.h>
#include <Ws2tcpip.h>
int main()
{
int optVal;
int optLen = sizeof(int);
WSADATA wsaData;
int err = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (err != NO_ERROR)
{
printf("WSAStartup failed with error %d\n", err);
return 1;
}
SOCKET listenSocketTCP = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (listenSocketTCP == INVALID_SOCKET)
{
printf("socket failed with error %d\n", WSAGetLastError());
return 1;
}
SOCKET listenSocketUDP = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (listenSocketUDP == INVALID_SOCKET)
{
printf("socket failed with error %d\n", WSAGetLastError());
return 1;
}
if (getsockopt(listenSocketTCP, SOL_SOCKET, SO_RCVBUF, (char *)&optVal, &optLen) != SOCKET_ERROR)
{
printf("TCP SO_RCVBUF Value: %d\n", optVal);
}
else
{
printf("TCP SO_RCVBUF getsockopt failed with error %d\n", WSAGetLastError());
return 1;
}
if (getsockopt(listenSocketTCP, SOL_SOCKET, SO_SNDBUF, (char *)&optVal, &optLen) != SOCKET_ERROR)
{
printf("TCP SO_SNDBUF Value: %d\n", optVal);
}
else
{
printf("TCP SO_SNDBUF getsockopt failed with error %d\n", WSAGetLastError());
return 1;
}
if (getsockopt(listenSocketUDP, SOL_SOCKET, SO_RCVBUF, (char *)&optVal, &optLen) != SOCKET_ERROR)
{
printf("UDP SO_RCVBUF Value: %d\n", optVal);
}
else
{
printf("UDP SO_RCVBUF getsockopt failed with error %d\n", WSAGetLastError());
return 1;
}
if (getsockopt(listenSocketUDP, SOL_SOCKET, SO_SNDBUF, (char *)&optVal, &optLen) != SOCKET_ERROR)
{
printf("UDP SO_SNDBUF Value: %d\n", optVal);
}
else
{
printf("UDP SO_SNDBUF getsockopt failed with error %d\n", WSAGetLastError());
return 1;
}
return 0;
}
你应该期待这样的输出:
TCP SO_RCVBUF Value: 65536
TCP SO_SNDBUF Value: 65536
UDP SO_RCVBUF Value: 65536
UDP SO_SNDBUF Value: 65536