首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >读取Windows缓冲区大小

读取Windows缓冲区大小
EN

Stack Overflow用户
提问于 2020-08-03 22:39:14
回答 2查看 1K关注 0票数 1

我发现很难找到如何通过命令提示符检查Windows中的UDP缓冲区大小。我正在寻找类似于linux命令"sysctl net.core.rmem_max“的东西。我不需要设置UDP缓冲区大小,我只需要检查它,以便在UDP缓冲区小于我建议的大小时抛出警告。到目前为止,我所看到的每一个地方都指向通过Windows注册表设置缓冲区大小。有人知道通过命令提示符或C++检查缓冲区大小的可能方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-03 23:06:38

我不知道如何从命令行执行此操作(看起来PowerShell可以做到这一点),但是您应该能够在C++中这样做,如下所示(注意:未经测试):

代码语言:javascript
运行
复制
#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");
}

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

票数 3
EN

Stack Overflow用户

发布于 2020-10-16 00:13:55

我使用了@Paul的代码,并根据getsockopt函数和socket函数的正式文档(可以找到我来这里是为了为套筒而来)添加了一些修改,更正了一些次要的细节,并将其编译为

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

我使用它来双重检查MS文档中有关DefaultReceiveWindow参数的信息,并试图找出DefaultReceiveWindow是否同时适用于TCP和UDP。

这是对我有用的代码:

代码语言:javascript
运行
复制
#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;
}

您应该期望这样的输出:

代码语言:javascript
运行
复制
TCP SO_RCVBUF Value: 65536
TCP SO_SNDBUF Value: 65536
UDP SO_RCVBUF Value: 65536
UDP SO_SNDBUF Value: 65536
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63237856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档