使用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 ...
随机推荐
- 新手在WindowsServer2016上安装ExchangeServer2016时的几点注意要点。
这两天试着在WindowsServer2016上安装ExchangeServer2016,遇到了两个头疼的问题,还好几经搜索加摸索终于把问题解决了,现在把经验分享出来,给遇到同样的问题的人以参考.在W ...
- [大数据]-Elasticsearch5.3.1 IK分词,同义词/联想搜索设置
--题外话:最近发现了一些问题,一些高搜索量的东西相当一部分没有价值.发现大部分是一些问题的错误日志.而我是个比较爱贴图的.搜索引擎的检索会将我们的博文文本分词.所以图片内容一般是检索不到的,也就是说 ...
- 文本主题模型之LDA(一) LDA基础
文本主题模型之LDA(一) LDA基础 文本主题模型之LDA(二) LDA求解之Gibbs采样算法 文本主题模型之LDA(三) LDA求解之变分推断EM算法(TODO) 在前面我们讲到了基于矩阵分解的 ...
- 集群/分布式环境下5种session处理策略
转载自:http://blog.csdn.net/u010028869/article/details/50773174?ref=myread 前言 在搭建完集群环境后,不得不考虑的一个问题就是用户访 ...
- CPU最核心的电子元件叫做石英晶振
CPU是电子计算机的主要设备之一,是电脑中的核心配件.主要功能是解释计算机指令以及处理计算机软件中的数据.有人会问,你知道CPU里面都有什么吗?我想大家都会说硅晶体,集成度极大的半导体材料.却没有人提 ...
- (HTTPS)-tomcat 实现 https 登录,去掉端口号
最近项目组要给日本客户做个产品,升级服务器交由我来升级.为了测试用,想要在自己电脑上搭个服务器. 服务器需要由https登录,并且不显示端口号. 费了些劲儿,看了n多帖子,好不容易弄好了.趁在没忘记之 ...
- linux压缩及vi操作
一:Linux的压缩方式 1.tar cvf 对文件进行压缩,tar cvf+压缩文件完成的命名+需要压缩的文件 2,tar -tf +命名的压缩文件:表示查看目录里面的内容 3,tar -xf 解压 ...
- 全景技术大揭秘,市场核心早洞悉——VR全景加盟
未来已来,未来已见.2017是3D全景创业的天时,全景行业逐步走向成熟.全景智慧城市专注vr全景6年,技术国内遥遥领先.全景智慧城市市场总监常诚,透漏3D全景技术和市场的核心. 拍摄全景必备的设备:单 ...
- MPP 二、Greenplum数据加载
Loading external data into greenplum database table using different ways... Greenplum 有常规的COPY加载方法,有 ...
- css3中强大的filter(滤镜)属性
CSS3中强大的filter(滤镜)属性 博主最近在做网站的过程中发现了一个非常强大的CSS3属性,就是filter(滤镜)属性,喜欢p图的朋友看名字都应该知道这是什么神器了吧.当然,这个属性的效果肯 ...