使用UDP完成网络通信
语言聊天有可以接受丢包但是不能接受乱序的特性,所以可以采用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完成网络通信的更多相关文章
- UDP SOCKET网络通信 C#
接收端 using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Thread ...
- UDP实现网络通信程序
VC6.0创建基于UDP协议的网络聊天程序 只有一个工程UDP,服务器和客户端都是这个工程,因为UDP中C/S区分不强化 只讲关键部分,避免累赘 1.为对话框添加控件 2.为控件绑定变量和消息函数 启 ...
- 计算机网络通信、线程、tcp、udp通信及信号量等读书笔记
一.计算机网络 1.什么是计算机网络:把分布在不同地理位置的计算机与专门的网络设备用通信线路互相连成一个规模大.功能强的系统,从而使众多计算机可以方便地互相传递信息.共享软件.硬件.数据信息等.简单来 ...
- Laxcus大数据管理系统2.0(8)- 第六章 网络通信
第六章 网络通信 Laxcus大数据管理系统网络建立在TCP/IP网络之上,从2.0版本开始,同时支持IPv4和IPv6两种网络地址.网络通信是Laxcus体系里最基础和重要的一环,为了能够利用有限的 ...
- P2P通信中使用ENet提供UDP的可靠传输
ENet官网:http://enet.bespin.org/ 按照他的说法: ENet's purpose is to provide a relatively thin, simple and ro ...
- Hololens开发笔记:UDP接收数据
Hololens的应用需要与其他设备通信的时候,UDP是比较方便的一种方式,Unity3d 2017.3 C#开发的时候可以用Windows.Networking.Sockets.DatagramSo ...
- Java入门系列-25-NIO(实现非阻塞网络通信)
还记得之前介绍NIO时对比传统IO的一大特点吗?就是NIO是非阻塞式的,这篇文章带大家来看一下非阻塞的网络操作. 补充:以数组的形式使用缓冲区 package testnio; import java ...
- 使用 acl 编写 UDP 网络程序(UDP 重传及可靠性机制)
在当今网络世界,虽然大部分网络应用都是基于 TCP 的,但有时 UDP 的网络通信也有用武之处.acl 的网络库中不仅提供了基于 TCP 的网络套接字流,同时也提供了 UDP 的网络库(目前 acl ...
- .NET知识结构
.NET知识结构 .NET介绍 微软.NET战略及技术体系,.NET Framework框架类库(FCL),公共语言运行时(CLR),通用类型系统(CTS),公共语言规范(CLS),程序集(Assem ...
随机推荐
- 【源码学习】之requirejs
对于现在的前端生态来说,requirejs是有点过时了,webpack帮我们包干了一切.但是对于学习源码这件事情来说,永远是不过时的! 最近稍微闲下来了一点,就着以前做过的项目,我也来看看requir ...
- SSH协议(转载)
一. SSH是什么? SSH的全称是Secure Shell, 是一种"用来在不安全的网络上安全地运行网络服务的一种加密网络协议". 简单说,SSH是一种网络协议,用于计算机之间的 ...
- SCAU Individual Contest #1
总结一下就是自己太弱.每次打比赛遇到比较难题就喜欢瞎开题,结果都是每题想一下,然后就是结束了. A:题意让你用小写字母构造一个总共有K个的回文串,比如aba的话就是{a}{b}{a}{aba}四个,比 ...
- jmeter 环境部署、数据库设置、分布式设置、多网卡配置等随笔
<!-- linux系统修改系统环境变量 系统语言-->[root@web-249 ~]# env|grep LANGLANG=zh_CN.UTF-8[root@web-249 ~]# ...
- Images as x-axis labels
Open-source software is awesome. If I found that a piece of closed-source software was missing a fea ...
- Ace Admin 使用教程
(原) 公司项目要换框架,然后丢了一套国外的给我,ace admin,本想着拿来改改,翻翻百度就能用的,可它是国外的啊,国内普及率又不高,没办法,硬着头皮一点点啃英文文档吧. File(文件) 简介: ...
- Android 图片加载框架Picasso基本使用和源码完全解析(巨细无比)
写在之前 原本打算是每周更新一篇博文,同时记录一周的生活状态,但是稍微工作忙一点就顾不上写博客了.悲催 还是说下最近的状况,最近两周一直在接公司申请的计费点, 沃商店,银贝壳,微信等等,然后就是不停的 ...
- AbstractHandlerMapping解读
一.AbstractHandlerMapping简介 AbstractHandlerMapping是HandlerMapping的抽象实现,所有的HandlerMapping都继承自AbstractH ...
- 初始化CSS
为什么要初始化CSS? 建站老手都知道,这是为了考虑到浏览器的兼容问题,其实不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面差异.当然,初始化样式会对SEO有一定的 ...
- Javascript中的数组去重-indexof方法
在Javascript中,有时我们会用到数组去重.我在这里给大家介绍一下本人认为最简单实用的一种方法-indexOf()去重. var arr = [1,1,1,2,2,2,3,3,4,5,6,2,1 ...