使用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 ...
随机推荐
- hdu 2114 Calculate S(n) 数论(简单题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2114 自己对数论一窍不通啊现在,做了一道水题,贴出来吧...主要是让自己记住这个公式: 前n项和的立方 ...
- 学习笔记:javascript内置对象:数组对象
1.数组对象的创建 1.设置一个长度为0的数组 var myarr=new array(); 2.设置一个长度为n的数组 var myarr=new arr(n); 3.声明一个赋值的指定长度 ...
- jqPaginator 项目中做分页的应用技巧
最近做后台管理系统,分页用到的不少,项目中其实已经有分页功能的组件但是不够高度自定义,于是就找到了 jqPaginator 高度自定义的Html结构 初始化引用如下: $("#paginat ...
- PreparedStatement/Statement处理insert update等操作时乱码,以及URL
原文: 在顶目中无意中碰到PreparedStatement 在存DB时出现乱码,困扰了好久终于解决问题 问题代码如下 ps = con.prepareStatement(INSERT_SQL); p ...
- centos永久修改主机名
永久修改主机名 以上的修改只是临时修改,重启后就恢复原样了. 步骤1: 修改/etc/sysconfig/network中的hostname vi /etc/sysconfig/network HOS ...
- 华为路由器AR1220F-S的端口映射NAT配置(拨号光纤上网)
telnet 登录 或者ssh登录路由器 //进入系统试图界面 sys-view //第一步. 添加acl规则, 允许内网本身访问对外的公网ip. 否则,只能外部人员访问你的公网ip [Huawei] ...
- PHP导出生成excel文件
composer包管理工具还是非常好用的 下载安装的扩展比较靠谱 无需自己解决扩展BUG 省时省力提高效率 1.下载安装composer自行百度 2.通过composer下载安装office 3.不在 ...
- 腾讯云万象优图每个账户提供50G的图片存储(支持黄图检测)
文章由GIT博客迁移过来 程序下载地址(源码也在):点我下载 设计说明 10月20号晚上,准备写这么一个程序. 腾讯云万象优图每个账户提供50G的图片存储(支持黄图检测) 可以在截图之后,直接点击上传 ...
- Word Ladder II 2015年6月4日
Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) from ...
- [原创]CentOS下Mysql双机互为备份
一.环境: 1.安装Centos-6.5-x64位系统的机器两台: host1:192.168.2.3 host2:192.168.2.4 (互相能ping通) 2.安装Mysql. 命令:Yum ...