qnicky
驱动牛犊
驱动牛犊
  • 注册日期2003-02-27
  • 最后登录2004-11-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1455回复:3

屏幕广播的程序的难题

楼主#
更多 发布于:2003-07-01 18:58
各位大虾,我做了一个屏幕广播的程序,必须要使用UDP这个该死的不可靠的协议,服务端在广播数据时客户端有很多数据没有收到,结果效果很差,可有高人相告如何是好?狂给分20,我只有这么点分可给了):。
king229
驱动中牛
驱动中牛
  • 注册日期2003-04-29
  • 最后登录2012-04-10
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-01 20:05
不会啊 我做UDP时很稳定啊
鬼啊~~~~~~~~
qnicky
驱动牛犊
驱动牛犊
  • 注册日期2003-02-27
  • 最后登录2004-11-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-07-02 09:28
我发送的数据量很大,又很频繁,接受到数据后又需要一定的时间处理,因此很容易造成大量的数据包丢失。后来我把发送数据的速度降低,数据丢失减少了,可是系统的反应速度又降低了。
我的发送代码是这样的,


bool CMulticastSocket::Send( char *const buffer,const DWORD dwSendLen)
{


ASSERT(m_SendSocket.m_hSocket != INVALID_SOCKET);
    if(buffer == NULL)
{
return false;
}


const int perLoopLen = 300;
    int loops =  dwSendLen / perLoopLen;
int restLen = dwSendLen % perLoopLen;
int startPos = 0;

    TRACE(\"total LOOPS = %d\\r\\n\",loops);

for(int i = 0; i<loops+1 && loops; i++)
{
startPos = i*perLoopLen;
int iSend = m_SendSocket.SendTo(buffer+startPos, perLoopLen, (SOCKADDR*)&m_saHostGroup, sizeof(SOCKADDR), 0) ;
if (iSend == SOCKET_ERROR)
{
char errInfo[200];
wsprintf(errInfo,\"sendto failed with: %d\\n\", WSAGetLastError());
             TRACE(errInfo);
//MessageBox(NULL,errInfo,\"Socket error\",MB_OK);
m_dwLastError = WSAGetLastError();
return false;
}
               //通过在这里睡眠来降低发包的速度
               Sleep(10);  
TRACE(\"LOOPS I= %d\\r\\n\",i);
}
    int iSend =  m_SendSocket.SendTo(buffer+startPos, restLen, (SOCKADDR*)&m_saHostGroup, sizeof(SOCKADDR), 0) ;
if(iSend == SOCKET_ERROR)
{
//sprintf(errInfo,\"sendto failed with: %d\\n\",
// WSAGetLastError());
//MessageBox(NULL,errInfo,\"Socket error\",MB_OK);
m_dwLastError = WSAGetLastError();
return false;
}

return true;



/*
    if(m_SendSocket.SendTo(buffer, dwSendLen, (SOCKADDR*)&m_saHostGroup, sizeof(SOCKADDR), 0) == SOCKET_ERROR)
return false;
else
return true;
*/
}


接收代码是这样的
bool CMulticastSocket::Recv(char * buffer,DWORD dwRecvLen)
{
    ASSERT(m_RecvSocket.m_hSocket != INVALID_SOCKET);

    if(buffer == NULL)
{
return false;
}

int                  ret = 0;
 
const int            perLoopLen = 300;
int                  loops =  dwRecvLen / perLoopLen;
int                  restLen = dwRecvLen % perLoopLen;
int                  startPos = 0;
int                  len=16;

TRACE(\"total LOOPS = %d\\r\\n\",loops);

for(int i = 0; i<loops+1 && loops; i++)
{
startPos = i*perLoopLen;
        ret = m_RecvSocket.ReceiveFrom(buffer+startPos, perLoopLen, m_strSendersIP, m_nSendersPort);
        //ret = recvfrom( m_hSocket, buffer+startPos,perLoopLen,0,NULL,NULL) ;
if (ret == SOCKET_ERROR)
{
//sprintf(errInfo,\"sendto failed with: %d\\n\",
// WSAGetLastError());
//MessageBox(NULL,errInfo,\"Socket error\",MB_OK);
TRACE(\"RECV ERROR in loops\\r\\n\");
m_dwLastError = WSAGetLastError();
return false;
}
   TRACE(\"LOOPS I= %d\\r\\n\",i);

}


ret = m_RecvSocket.ReceiveFrom (buffer+startPos,restLen,0,NULL, NULL) ;
if (ret == SOCKET_ERROR)
{
//sprintf(errInfo,\"sendto failed with: %d\\n\",
// WSAGetLastError());
//MessageBox(NULL,errInfo,\"Socket error\",MB_OK);
m_dwLastError = WSAGetLastError(); //经常会遇到10040错误,说是缓冲区不够大
           //遇到这种情况这次发送数据算是彻底完蛋了
if(m_dwLastError == 10040)
{
TRACE(\"RECV ERROR 10040 \\r\\n\");
return true;
}
return false;
}
return true;


}

大虾,对这段代码可有改进妙方。
deltali
驱动小牛
驱动小牛
  • 注册日期2002-10-25
  • 最后登录2010-07-06
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望23点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-07-13 15:26
是啊,我做的时候也没有什么问题阿?很少有丢包的现象。
我又来了,生命不息,驱动不止。
游客

返回顶部