udp通信的消息处理方案

0、引言

  大家都知道当使用udp通信时,最大的一个问题是会出现丢包的情况,那么如何可以既使用udp来传输,又同时能有效防止丢包呢?

  本文提供一种简单有效的方法,可以显著避免udp丢包的问题。此外,如果要达到类似tcp通信的效果,则需要相应添加其他规则。基于udp来实现tcp的方法有google提供的开源框架——libjingle,大家感兴趣的话,可以下载源码来学习参考。

1、建立发送消息结构体和接收消息结构体

struct SendMsg
{
    time_t expire_time;
    unsigned int try_count;
    int data_len;
    char* data;
    SendMsg():expire_time(0), try_count(0), data_len(0), data(NULL){}
}

struct RecvMsg
{
    time_t expire_time;
    int data_len;
    char* data;
    RecvMsg():expire_time(0), data_len(0), data(NULL){}
}

2、唯一标识消息的来源或消息发送的去处,暂时使用对方的ip和port

struct AddrIndex
{
    unsigned short port;
    unsigned int ip;
    unsigned in tran_id; //数据包标识,由对方生成数据包时进行累加
    bool isSend; //是发送的数据还是接收的数据
    //实现<运算符操作,因若要在map中使用AddrIndex作为索引项,需要将之实现
    bool operator<(const AddrIndex& addrIndex) const
    {
        if (this->ip < addrIndex.ip)
        {
            return true;
        }
        else if (this->ip < addrIndex.ip)
        {
            return false;
        }
        if (this->port < addrIndex.port)
        {
            return true;
        }
        else if (this->port < addrIndex.port)
        {
            return false;
        }
        if (this->tran_id < addrIndex.tran_id)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

3、创建udp数据包核查的数据结构

class UdpCheck
{
private:
    map<AddrIndex, SendMsg> send_check_msg;
    map<AddrIndex, RecvMsg> recv_check_msg;
    int sock_fd;
    unsigned int timeout_unit;
    unsigned int max_try_count;

public:
    //公有接口主要如下所示:
    //1.当接收到数据包后,查看接收历史是否有一致的数据包,若有则更新历史的数据包

    //2.当发送数据包后,查看发送历史是否有一致的数据包,若有则更新历史的数据包,否则插入历史中

    //3.当接收数据包后,查看接收历史是否有一致的数据包,若有则更新历史的数据包,否则插入历史中

    //4.当接收到发送数据的应答后,就从发送历史中删除相应数据包

    //5.当接收请求,但处理失败时,就从接收历史中删除相应数据包

    //6. 遍历发送历史中的数据包,判断是否重发,是否删除
            //当重试次数没有超过最大值,且记录维持时间小于time_unit*max_try_count时,则不删除,且重发udp数据包

    //7. 遍历接收历史,判断是否过期删除

    //8. 外部还需要提供一个定时器来定时查看接收和发送历史
}

原文地址:https://www.cnblogs.com/share-ideas/p/10895851.html

时间: 2024-10-30 07:38:13

udp通信的消息处理方案的相关文章

UDP通信

UDP通信的实体都是对等的. Server可以绑定端口,client实际上也可以绑定端口,如果不绑定端口,系统给socket随机关联一个端口. Client也可以通过Connect建立和server的连接. 例如: client绑定1900,server绑定1500 udp 0 0 0.0.0.0:1500 0.0.0.0:* udp 0 0 127.0.0.1:1900 127.0.0.1:1500 ESTABLISHED

wince 6.0下UDP通信需要注意MAC地址

最近在wince6.0下进行网络通信,在ARM下使用UDP通信协议.当然了,首先按照自己的使用配置wince中的IP,修改注册表即可. 我是wince的菜鸟,但是绝不是使用UDP通信的新手,在windows下跑过多次的UDP发送端和接收端,在wince下却怎么都不能像在windows下使用那么顺利,出现了不可理解的现象: (1)wince和wince相互通信,发送成功了,可是接收端却没有收到数据包: (2)wince和windows相互通信,发送和接收都正常: (3)wince和windows互

c# socket通信较完善方案

c#的socket通信应用.文件较多.附件为工程.  core AbstractBytesWorker.cs    字节工作器(基类),用于用于同一不同功能的字节工作器 BinaryHand.cs  2进制处理器.  ThDispose.cs 处理回收相关 crc  entity ThPersonInfo.cs manager ThSocketManager.cs  ThSocketManagerBusiness.cs 所有的业务 request RequestCode.cs  请求码 ThPr

HP-SOCKET TCP/UDP通信框架库解析

项目概述: HP-SOCKET是一套通用TCP/UDP通信框架,包括服务器.客户端.Agent组件:其目标是提供高性能.通用性.简易性.可扩展.可定制: 鉴于此,其仅实现基本的通用框架通信.数据收发功能,供上层应用直接简单使用的接口实现:而对于数据包完整性和协议解析等未处理, 也就意味着需要应用层自己处理一些数据包构造或解析等操作: 事实上目前只能支持windows平台: 1. 对于TCP通信模式下:服务器端和Agent均采用的是异步IO模型中的完成端口模型,客户端采用的是就绪IO通告模型中的W

android udp通信(应用层与底层硬件的通信)

背景:最近项目用到一块工控板,板子硬件与上位机通过udp方式进行通信,但厂家只提供了c#的demo,并将相应的驱动命令封装为dll动态库.另一项目小组希望在android平台下也能驱动这块工控板,我之前写过一些底层的驱动,但都收通过串口来传输的,通过网络进行数据通信的还是头一次接触.简单地看了下硬件的通信协议,还好,不算很复杂,每条命令只有20个字节.于是开始了解在android下如何实现Udp通信,现积累如下. what? 字面意思:UDP的全称是 User Datagram Protocol

JAVA网络编程--UDP通信

首先网络传输数据需了解例如以下三点 1.找到对方IP 2.数据要发送到对方指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序用数字进行了标识.为了方便称呼这个数字,叫做port,逻辑port 3.  定义通信规则.这个通信规则称为协议. 国际组织定义了通用协议TCP/IP. 127.0.0.1本机回环地址 不易记忆,可用主机名 主机名:localhost 0-65535port范围 0-1024系统使用或保留port .当中mysql的port号为 3306 一.UDP UDP相对于

qt在windows下的udp通信(最简单)

qt编程:windows下的udp通信 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:win7 开发环境:qt 功能: 用udp进行收发通信 界面: 源代码: LssHost.pro: [cpp] view plain copy #------------------------------------------------- # # Project created by QtCreator 2013-09-22T09:36:44

Android 之简单UDP通信

一 Android UDP通信编程步骤 服务器端: 1.建立Socket 2.监听端口  3.接收数据  4.实现数据发送 客户端:直接实现数据发送即可 二 代码,实现一个简单的UdpHelper类 1 package com.br.delphi.centercontrol; 2 3 import android.os.Handler; 4 import android.os.Message; 5 import android.util.Log; 6 7 import java.io.IOExc

高性能 TCP &amp; UDP 通信框架 HP-Socket v3.5.1 正式发布

HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Delphi.E(易语言).Java.Python 等编程语言接口.HP-Socket 对通信层实现完全封装,应用程序不必关注通信层的任何细节:HP-Socket 提供基于事件通知模型的 API 接口,能非常简单高效地整合到新旧应用程序中. 为了让使用者能方便快速地学习和使用 HP-Socket,迅速掌握