• 网络笔记


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

    发现自己的不足,善于利用找到的方法去扬长避短。行动起来。
  • 相关阅读:
    SpringBoot整合WebSocket的客户端和服务端的实现
    Django实现发送邮件
    Python环境搭建
    Hexo+Gitee搭建个人博客
    Chrome浏览器安装离线插件Markdown Here
    TestLink测试用例管理工具使用说明
    【odoo14】【好书学习】odoo 14 Development Cookbook【目录篇】
    【odoo14】【开发侧】权限配置
    【odoo14】【用户侧】权限配置
    【odoo14】【知识点】视图的继承逻辑
  • 原文地址:https://www.cnblogs.com/rechen/p/5090302.html
Copyright © 2020-2023  润新知