语言聊天有可以接受丢包但是不能接受乱序的特性,所以可以采用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. [刷题]算法竞赛入门经典(第2版) 5-1/UVa1593 - Alignment of Code

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) //UVa1593 - Alignment of Code #include&l ...

  2. Struts流程分析+源码分析

    1.初始化工作 读取配置---转换器-----读取插件 当struts-config.xml配置文件加载到内存,则会创建两个map:ActionConfigs,FromBeans.这两个map都交由M ...

  3. fopen的使用小记

    整理自https://msdn.microsoft.com/zh-cn/library/t3ayayh1(VS.80).aspx errno, _doserrno, _sys_errlist, and ...

  4. javaWeb学习总结(2)- http协议

    一.http简介 1.基本介绍: (1)客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵守一定的通讯格式,HTTP协议用于定义客户端与web服务器通迅的格式. (2)WEB浏览器 ...

  5. 浅谈 Java 主流开源类库解析 XML

    在大型项目编码推进中,涉及到 XML 解析问题时,大多数程序员都不太会选用底层的解析方式直接编码. 主要存在编码复杂性.难扩展.难复用....,但如果你是 super 程序员或是一个人的项目,也不妨一 ...

  6. 日志组件一:Log4j

    log4j是Apache的一个开源项目,陪伴了我们多年,但是现在已经不更新了.官网原文如下: Log4j 1.x has been widely adopted and used in many ap ...

  7. 外部无法捕捉Realm的doGetAuthenticationInfo方法抛出的异常

    shiro权限框架,用户登录方法的subject.login(token)会进入自定义的UserNamePasswordRealm类的doGetAuthenticationInfo身份验证方法 通常情 ...

  8. CCNA毕业测试

    要求: 1:不同楼层物理隔离,但逻辑相连 2:相同楼层物理相连,但逻辑隔离 3:主机可以动态获取IP地址 4:不同VLAN间可以进行通信 5:主机最终访问www.baidu.com弹出Congratu ...

  9. ArrayList源码解读

    在端午节这个节日里,有一个特殊的任务,我带着你一起揭开"ArrayList"的真面目.从成员变量.构造函数.主要方法三部分,对ArrayList有进一步的认识,希望能够帮助你. 一 ...

  10. PHP文件操作,多行句子的读取,file()函数,file_get_contents()函数,file_put_contents()函数,is_file,统计网站pv (访问量),文件的复制 copy,文件重命名 rename,删除文件 unlink

    php中添加utf-8: header("Content-type:text/html;charset='UTF-8'"); 文件操作步骤: 1.在同一目录下建立一个file.tx ...