博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
网络笔记
阅读量:6413 次
发布时间:2019-06-23

本文共 2330 字,大约阅读时间需要 7 分钟。

//    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楼说的一样 收一条回复一条 还加设置了超了 暂时没出现问题 呵呵

 

转载于:https://www.cnblogs.com/rechen/p/5090302.html

你可能感兴趣的文章
让虚拟机的软盘盘符不显示(适用于所有windows系统包括Windows Server)
查看>>
Cygwin不好用
查看>>
jQuery插件之验证控件jquery.validate.js
查看>>
[经验]无线鼠标和无线键盘真的不能用了?——雷柏的重生之路~
查看>>
【转】plist涉及到沙盒的一个问题
查看>>
GNU make manual 翻译( 一百四十五)
查看>>
重构之美-走在Web标准化设计的路上[复杂表单]3 9 Update
查看>>
linux中的优先搜索树的实现--prio_tree【转】
查看>>
转载: 打造自己的asp.net验证控件
查看>>
重构之美-跨越Web标准,触碰语义网[开门见山:Microformat]
查看>>
git入门与实践【转】
查看>>
WPF 虚拟键盘
查看>>
储存卡无法打开专家教您怎么数据恢复
查看>>
彼得原理
查看>>
如何利用【百度地图API】,制作房产酒店地图?(下)——结合自己的数据库...
查看>>
[20171113]修改表结构删除列相关问题3.txt
查看>>
特征选择
查看>>
在Winform程序中设置管理员权限及为用户组添加写入权限
查看>>
RTMP直播到FMS中的AAC音频直播
查看>>
多能互补提速 加快我国能源转型和现代能源体系建设
查看>>