语言聊天有可以接受丢包但是不能接受乱序的特性,所以可以采用UDP来

传输数据提高效率。

因为UDP本身不可靠传输的特性,为了保证玩家可靠的接入服务器和一些

操作的正确执行,还是需要一些额外的代码保证UDP的可靠性传输。

一个简单的方案是在发送端发送一个包之后,等待接收端发送的recvack,

如果没有接收到recvack则重复发送直到超时。发送端接到recvack则发送

confrimack。接收端若没有收到confrimack重复发送知道超时。

为了区分可靠和非可靠性传输,为以枚举的形式封包提供了不同的包类型

需要提供不同的:

enum sendtype{

    safe_send,

    unsafe_send,

并且提供不同的发送接口:

void unsafe_send(char* buf,int len,const sockaddr* addr, int addrlen){

    int datalen += sizeofsenddatahead;

    senddata * data = (senddata*)malloc(datalen);

    data->type = unsafe_send;

    data->len = len;

    memcpy(data->data, buf, len);

    sendto(fd, data, datalan, 0, addr, addrlen);

}

void safe_send(char* buf,int len,const sockaddr* addr,int addrlen){

    int datalen += sizeofsenddatahead;

    senddata * data = (senddata*)malloc(datalen);

    data->type = safe_send;

接收端在接收到数据后,如果是safe_send,则发送recvack:

void sendrecvack(sockaddr_in & addr, int addrlen){
  recvack cmd;
  cmd.isrecv = cmdrecvack;
  safe_send(&cmd, sizeofconfrimack, (sockaddr*)&addr, addrlen);

发送端在接收到recvack后,发送confrimack:

void sendconfrimack(sockaddr_in & addr, int addrlen){

    confrimack cmd;

    cmd.isrecv = cmdconfrimack;

    unsafe_send(&cmd, sizeofconfrimack, (sockaddr*)&addr, addrlen);

使用心跳控制重发包:

void safesendheadbeat(int time, void * data){

    if (!vsenddata.empty()){

        senddata * data = vsenddata.front();

        sendto(fd, data, data->len, 0, addr, addrlen);

    }

    addtime(25,  safesendheadbeat, data);

使用心跳控制recvack:

void recvackheadbeat(int time, void * data){

    if (recvack != 0){

        sendto(fd, recvack, recvack->len, 0, addr, addrlen);

    }

    addtime(25,  recvackheadbeat, recvack);

使用UDP完成网络通信的更多相关文章

  1. UDP SOCKET网络通信 C#

    接收端 using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Thread ...

  2. UDP实现网络通信程序

    VC6.0创建基于UDP协议的网络聊天程序 只有一个工程UDP,服务器和客户端都是这个工程,因为UDP中C/S区分不强化 只讲关键部分,避免累赘 1.为对话框添加控件 2.为控件绑定变量和消息函数 启 ...

  3. 计算机网络通信、线程、tcp、udp通信及信号量等读书笔记

    一.计算机网络 1.什么是计算机网络:把分布在不同地理位置的计算机与专门的网络设备用通信线路互相连成一个规模大.功能强的系统,从而使众多计算机可以方便地互相传递信息.共享软件.硬件.数据信息等.简单来 ...

  4. Laxcus大数据管理系统2.0(8)- 第六章 网络通信

    第六章 网络通信 Laxcus大数据管理系统网络建立在TCP/IP网络之上,从2.0版本开始,同时支持IPv4和IPv6两种网络地址.网络通信是Laxcus体系里最基础和重要的一环,为了能够利用有限的 ...

  5. P2P通信中使用ENet提供UDP的可靠传输

    ENet官网:http://enet.bespin.org/ 按照他的说法: ENet's purpose is to provide a relatively thin, simple and ro ...

  6. Hololens开发笔记:UDP接收数据

    Hololens的应用需要与其他设备通信的时候,UDP是比较方便的一种方式,Unity3d 2017.3 C#开发的时候可以用Windows.Networking.Sockets.DatagramSo ...

  7. Java入门系列-25-NIO(实现非阻塞网络通信)

    还记得之前介绍NIO时对比传统IO的一大特点吗?就是NIO是非阻塞式的,这篇文章带大家来看一下非阻塞的网络操作. 补充:以数组的形式使用缓冲区 package testnio; import java ...

  8. 使用 acl 编写 UDP 网络程序(UDP 重传及可靠性机制)

    在当今网络世界,虽然大部分网络应用都是基于 TCP 的,但有时 UDP 的网络通信也有用武之处.acl 的网络库中不仅提供了基于 TCP 的网络套接字流,同时也提供了 UDP 的网络库(目前 acl ...

  9. .NET知识结构

    .NET知识结构 .NET介绍 微软.NET战略及技术体系,.NET Framework框架类库(FCL),公共语言运行时(CLR),通用类型系统(CTS),公共语言规范(CLS),程序集(Assem ...

随机推荐

  1. JS执行事件

    先贴出几个名词: 同步任务: 在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务 异步任务:   不进入主线程,而进入"任务队列"的任务,只有任务队列通知主线程, ...

  2. 最常用的css垂直居中方法

    css垂直居中一直以来都是一个被大家说烂了的话题,翻来覆去的炒.不过说实话,正是因为css没有提供标准的垂直居中方法(不过在css3中已经有了相关规范),所以大家才会对它进行专门的研究.这研究来研究去 ...

  3. 【Netty】ChannelHandler和codec

    一.前言 前面学习了Netty的codec框架,下面接着学习ChannelHandler与codec之间的关联. 二.ChannelHandler和codec Netty为不同的协议提供了处理器和编解 ...

  4. kafka 0.10.2 消息生产者

    package cn.xiaojf.kafka.producer; import org.apache.kafka.clients.producer.KafkaProducer; import org ...

  5. AutoMapper总结

    AutoMapper是一个对象和对象间的映射器.对象与对象的映射是通过转变一种类型的输入对象为一种不同类型的输出对象工作的.让AutoMapper有意思的地方在于它提供了一些将类型A映射到类型B这种无 ...

  6. webpack 2.x 配置

    以下展示2.x 配置文件信息 v1 迁移至 v2 官方有更详细的说明 具体详见 https://webpack.js.org/guides/migrating/ 只列举常用到参数进行描述, 或者我在使 ...

  7. Java 9 揭秘(1.Java入门介绍)

    文 by / 林本托 在第一部分中,主要讲解如下内容: JDK 9 包含了哪些内容 运行代码的系统要求 如何安装 NetBeans 1 JDK 介绍 JDK 9是Java开发工具包的第九个主要版本,计 ...

  8. 天气正好,hello world!

    两个多月,稀里糊涂的回来了,内心很迷茫,回来一周了,明知道还需要有一大堆东西需要去学,但是却找不到之前学习的状态,在寝室,在实验室,看着自己一向不喜欢的电视剧,无目的的逛着淘宝,刷着头条和知乎,就这么 ...

  9. laravel 服务容器实现原理

    前言 通过实现laravel 框架功能,以便深入理解laravel框架的先进思想. 什么是服务容器 服务容器是用来管理类依赖与运行依赖注入的工具.Laravel框架中就是使用服务容器来实现 ** 控制 ...

  10. css3的学习

    已经学习css3一个月了,通过对css3的深入学习,我对网页设计的理解就更深刻了,以前只会用简单的图片,定位等来制作网页,现在可以运用css3扩展的新内容来写出更好看的网页. css3扩展内容中,我认 ...