标签:
// AfxGetApp()->m_pMainWnd->GetDlgItem(IDC_DISP_1).SetWindowText("nihao"); //CString strlen; //strlen.Format(TEXT("%s"), len); 注释掉就可以, 红色部分是要注意的程序位置,,,, void CUdpSocket::OnReceive(int nErrorCode) { // TODO: Add your specialized code here and/or call the base class //接收缓存 TCHAR recBuf[1024]; //接收到字节数。 int len = sizeof(SOCKADDR_IN); CString strlen; strlen.Format(TEXT("%d"),len);//注意格式化的格式是d,将整数len以整数形式格式化成字符串。 //清空接收缓存 ZeroMemory(recBuf, sizeof(recBuf)); //接收数据 int recBytes = ReceiveFrom(recBuf, 1023, (SOCKADDR*)&m_clientAddr, &len, 0); if (0 == recBytes) { AfxMessageBox(TEXT("UDP连接已经关闭!")); } else if (SOCKET_ERROR == recBytes) { AfxMessageBox(TEXT("接受数据失败!")); } else { //判断接收的字节数据 CString strBuf; strBuf.Format(TEXT("%s"), recBuf); ((CUDPDlg*)(AfxGetApp()->m_pMainWnd))->GetDlgItem(IDC_DISP_1)->SetWindowText(strBuf); ((CUDPDlg*)(AfxGetApp()->m_pMainWnd))->GetDlgItem(IDC_DISP_2)->SetWindowText(strlen); //GetDlgItem(IDC_DISP_1).SetWindowText(strBuf); //来获取主对话框的指针。 } //不使用这种方式,程序会崩溃 //pDlg->OnUDPDlgSocketReceive(this); CSocket::OnReceive(nErrorCode); }
有可能你包发送快了,造成堵塞。这可能产生丢包。
我最近做rtp传输,我看到一般在收数据包前,都会用到fd_set结构体,通过select方式来判断缓冲区是否可用,可用再调用recv()。你可以了解下这方面的东西
阻塞啦,,建议用分块传输
参照一下飞鸽的文件传输,好像用的是内存映射
应该是接收端慢导致出现零窗口而阻塞了。可以抓包看一下。
顶4L,肯定是接收端接收的问题,导致的!
建议定义自己的消息包,每次检验消息长度!
建议看看网络通信这本书,阻塞与非阻塞的相同和不同点。
用分块传输,在数据包前面加个包头。
自定义写个发送接收,检查发送和接收的结果
发送:直到发送完成或SOCKET出错才返回
BOOL MySend(SOCKET sock, LPVOID lpData, int nSize) { //*自订义数据发送,直到发送完成时才返回 char* Buf = (char*)lpData; int nLen = nSize; int n; int nIndex = 0; while(nLen > 0) { n = send(sock, &Buf[nIndex], nLen, 0); if(n == SOCKET_ERROR) return FALSE; nIndex += n; nLen -= n; } return TRUE; }
//接收:直到接收到指定数量的数据或SOCKET出错才返回 //用于接收的sock,接收的数据放到lpData中,总长度为nSize, BOOL MyReceive(SOCKET sock, LPVOID lpData, int nSize) { //*自订义数据接收,直到接收到指定大小的数据后才返回 char* Buf = (char*)lpData;//缓存地址 int nLen = nSize;//要接受的长度 int n;//单次接收计数 int nIndex = 0;//接收总数计数 while(nLen > 0) { n = recv(sock, &Buf[nIndex], nLen, 0);//接收数据 if(n == SOCKET_ERROR)//接收出错 return FALSE;//退出函数 nIndex += n;//接收的总个数 nLen -= n;//循环变量,要接收的长度递减 } return TRUE; }
嗯 做了修改和8楼说的一样 收一条回复一条 还加设置了超了 暂时没出现问题 呵呵
标签:
原文地址:http://www.cnblogs.com/rechen/p/5090302.html