阅读:1455回复:3
屏幕广播的程序的难题
各位大虾,我做了一个屏幕广播的程序,必须要使用UDP这个该死的不可靠的协议,服务端在广播数据时客户端有很多数据没有收到,结果效果很差,可有高人相告如何是好?狂给分20,我只有这么点分可给了):。
|
|
沙发#
发布于:2003-07-01 20:05
不会啊 我做UDP时很稳定啊
|
|
|
板凳#
发布于: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; } 大虾,对这段代码可有改进妙方。 |
|
地板#
发布于:2003-07-13 15:26
是啊,我做的时候也没有什么问题阿?很少有丢包的现象。
|
|
|