你的位置:
首页
>
业界
>
UDP编程之windows socket 缓冲区默认大小
笔者遇到下位机发过来的几百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);