C++ 读取Windows UDP缓冲区大小

C++ 读取Windows UDP缓冲区大小,c++,windows,udp,buffer,command-prompt,C++,Windows,Udp,Buffer,Command Prompt,我发现很难弄清楚如何在Windows中通过命令提示符检查UDP缓冲区大小。我正在寻找类似于linux命令sysctl net.core.rmem_max的东西。我不需要设置UDP缓冲区大小,只要检查它,如果它小于我建议的大小,就会抛出警告。到目前为止,我似乎看到的每个地方都指向通过Windows注册表设置缓冲区大小。有人知道通过命令提示符或C++( > P>简单检查缓冲区大小的可能方法吗?我不知道如何从命令行来做这件事,看起来可以做到,但是您应该能够在C++中这样做:注意:未测试: #inclu

我发现很难弄清楚如何在Windows中通过命令提示符检查UDP缓冲区大小。我正在寻找类似于linux命令sysctl net.core.rmem_max的东西。我不需要设置UDP缓冲区大小,只要检查它,如果它小于我建议的大小,就会抛出警告。到目前为止,我似乎看到的每个地方都指向通过Windows注册表设置缓冲区大小。有人知道通过命令提示符或C++( > P>简单检查缓冲区大小的可能方法吗?我不知道如何从命令行来做这件事,看起来可以做到,但是您应该能够在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");
}

我们不需要清理任何资源,因为程序退出时自动发生。

< P>我不知道如何从命令行来做这件事,看起来可以做,但是你应该能在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函数的官方文档添加了一些修改,可以找到并更正一些小细节,并将其编译为

g++get_buff_size.cpp-o get_buff_size.exe-lwsock32

我使用它来仔细检查MS文档中有关参数的信息,并试图确定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;
}

我使用了@Paul Sanders的代码,并根据getsockopt函数和socket函数的官方文档添加了一些修改,修改了一些小细节,并将其编译为

g++get_buff_size.cpp-o get_buff_size.exe-lwsock32

我使用它来仔细检查MS文档中有关参数的信息,并试图确定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;
}

他问如何从命令提示符上做这件事。@ MarquisofLorne或C++。我会编辑我的答案,给你一个机会来扭转你的下注。@为什么你决定投票否决这个答案,却忘了结束投票的问题?他问如何从命令提示符。@ MarquisofLorne或C++损坏。我将编辑我的答案,给你一个机会,让你有机会逆转你的否决票。@mar为什么你决定否决这个答案,但忘记结束投票?不回答被问到的问题。它怎么不回答这个问题?不回答被问到的问题。它怎么不回答这个问题?如果这个问题不是关于编程是离题的。如果这个问题不是关于编程,那么它就离题了。