码迷,mamicode.com
首页 > 其他好文 > 详细

网络笔记

时间:2015-12-30 23:39:06      阅读:256      评论:0      收藏:0      [点我收藏+]

标签:

//    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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!