我开发一个网络广播的程序,一个发送端程序,一个接收端程序。发送端程序在子线程中循环读文件数据并以广播的形式发送出去。
接收端程序在子线程中读取数据。实际运行过程中,发现发送端程序发送正常,但是接收端程序会出现数据丢失现象。
请问是什么原因造成的,是发送端发送得过快吗?
//发送端程序
int CNetWriteThread::Run() 
{
BOOL bContinue = TRUE; //发送
sockaddr_in SocketAddress;
memset(&SocketAddress, 0, sizeof(SocketAddress));
SocketAddress.sin_family = AF_INET;
SocketAddress.sin_addr.s_addr = INADDR_BROADCAST;
SocketAddress.sin_port = htons((u_short)5000); while (bContinue)
{
UINT nSendSize = m_pFile->Read(m_pWriteBuffer, 8000);

if (nSendSize > 0)
{
int nResult = sendto(*m_pSocket, (LPSTR)m_pWriteBuffer, nSendSize, 0, 
(sockaddr*)&SocketAddress, sizeof(SocketAddress));

if (SOCKET_ERROR == nResult)
{
bContinue= FALSE;
}
}
else
{
bContinue= FALSE;
}
} return 0;
}//接收端程序
int CNetReadThread::Run() 
{
BOOL bContinue = TRUE;
UINT nReadSize = 0; while (bContinue)
{
//读取数据
nReadSize = 10000;
int nResult = recvfrom(*m_pSocket, (LPSTR)m_pReadBuffer, 
nReadSize, 0, NULL, NULL); if (SOCKET_ERROR == nResult)
{
bContinue = FALSE;
}
} return 0;
}

解决方案 »

  1.   

    UDP不保证可靠性这个你需要自己封装应用程协议
      

  2.   

    你是用的是UDP协议,丢失数据是它的“特点”~!
    换成TCP协议。
      

  3.   

    1、改广播为组播
    2、限速处理
    3、你程序中读文件一次读8000,以太网最大帧应该是1500(不含MAC头),以8000这样广播的发,接收端收到还需要再组包,网卡来不及接受或处理。你可以改小发送数据包
    PS:在无网络拥挤的情况下,现在以太网的丢包率是很低,印象中是万分之三。广播包可能会引起广播风暴,造成大量丢包