最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

UDP编程之windows socket 缓冲区默认大小

业界 admin 4浏览 0评论

笔者遇到下位机发过来的几百k的文件,为了调试方便,一开始并没有加协议

后面发现在OnRecv的回调中打印消息时,居然UDP丢包了

后面经过多次分析,才发现windows默认的socket缓冲区是8k

使用setsockopt改大后就不会丢包了

int nRecvBuf = 700 * 1024;//设置为700K
    if (0 != setsockopt(m_sock, SOL_SOCKET, SO_RCVBUF, (const char*)&nRecvBuf, sizeof(int)))
    {
        TRACE(_T("setsockopt buf size failed.\n"), WSAGetLastError());
        return FALSE;
    }

 

if (getsockopt(m_pListenContext->m_Socket, 

    SOL_SOCKET, 

    SO_SNDBUF, 

    (char*)&optVal, 

    &optLen) != SOCKET_ERROR)

    pirnt("SockOpt Sendbuff Value: %d\n", optVal);

 

if (getsockopt(m_pListenContext->m_Socket, 

    SOL_SOCKET, 

    SO_RCVBUF, 

    (char*)&optVal, 

    &optLen) != SOCKET_ERROR)

    pirnt("SockOpt Recvbuff Value: %d\n", optVal);

笔者遇到下位机发过来的几百k的文件,为了调试方便,一开始并没有加协议

后面发现在OnRecv的回调中打印消息时,居然UDP丢包了

后面经过多次分析,才发现windows默认的socket缓冲区是8k

使用setsockopt改大后就不会丢包了

int nRecvBuf = 700 * 1024;//设置为700K
    if (0 != setsockopt(m_sock, SOL_SOCKET, SO_RCVBUF, (const char*)&nRecvBuf, sizeof(int)))
    {
        TRACE(_T("setsockopt buf size failed.\n"), WSAGetLastError());
        return FALSE;
    }

 

if (getsockopt(m_pListenContext->m_Socket, 

    SOL_SOCKET, 

    SO_SNDBUF, 

    (char*)&optVal, 

    &optLen) != SOCKET_ERROR)

    pirnt("SockOpt Sendbuff Value: %d\n", optVal);

 

if (getsockopt(m_pListenContext->m_Socket, 

    SOL_SOCKET, 

    SO_RCVBUF, 

    (char*)&optVal, 

    &optLen) != SOCKET_ERROR)

    pirnt("SockOpt Recvbuff Value: %d\n", optVal);
发布评论

评论列表 (0)

  1. 暂无评论