语言聊天有可以接受丢包但是不能接受乱序的特性,所以可以采用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. hdu4597 Play Game 区间DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4597 全国邀请赛通化赛区第8题--题目重现 思路: 区间DP的思想,想法是队友想出来的,感觉很秒,自己 ...

  2. 细看JS中的BOM、DOM对象

                                        DOM对象模型  DOM(Document Object Model),是指文档对象模型,是W3C组织推荐的处理可扩展标志语言的 ...

  3. [刷题]算法竞赛入门经典(第2版) 5-9/UVa1596 - Bug Hunt

    //开学了,好烦啊啊啊啊啊!怎么开个学那么多破事情!!都俩星期了,终于有时间写出来一道题 题意:不难理解,不写了.这几天忙的心累. 代码:(Accepted, 0.010s) //UVa1596 - ...

  4. loadrunner提高篇-场景设计实践

    集合点设置 一.为什么要进行集合点设置? 因为在测试过程中,并不能保证所有的Vuser都在同一时刻进行操作,这样就达不到并发测试的目的,故需要用到集合点技术,集合点的意思是如果在一个操作之前设置了一个 ...

  5. BM算法详解

    http://www-igm.univ-mlv.fr/~lecroq/string/node14.html http://www.cs.utexas.edu/users/moore/publicati ...

  6. 基于Kubernetes的WAF集群介绍

    Kubernetes是Google开源的容器集群管理系统.它构建Docker技术之上,为容器化的应用提供资源调度.部署运行.服务发现.扩容缩容等整一套功能,可看作是基于容器技术的PaaS平台. 本文旨 ...

  7. IE6.0升级的两种通用代码

    随着W3C组织开始针对新的Web标准提案日期的到来,HTML5以及CSS3的新时代即将到来,同时微软的Win8以及IE10的出现也带给了这个世界奇妙的结构. 微软早在不再给WinXP做技术支持时,IE ...

  8. React入门---属性(state)-7

    state------>虚拟dom------>dom 这个过程是自动的,不需要触发其他事件来调用它. state中文理解:页面状态的的一个值,可以存储很多东西. 学习state的使用: ...

  9. struts2.1.6教程三、在Action获取Scope对象

    引言:在前面的Action操作中,关键就是Action中的exectue方法,但是此方法并没有request.session.application等对象作为参数,自然就不能利用这些对象来操作.下面我 ...

  10. C语言之字符串

    什么是字符串:使用双引号包含的字符序列. 简单的字符串"hello world" 一个'h'是一个字符 很多个字符组合在一起就是字符串了 字符串与字符数组 在C语言中没有专门的字符 ...