使用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 ...
随机推荐
- hosts文件原理
hosts文件是一个用于储存计算机网络中各节点信息的计算机文件.这个文件负责将主机名映射到相应的IP地址.hosts文件通常用于补充或取代网络中DNS的功能.和DNS不同的是,计算机的用户可以直接对h ...
- kotlin 语言入门指南一
基于官网的Getting Start部分,翻译如下: 基础语法 定义一个包 包的声明必须放在文件头部: package my.demo import java.util.* // ... 不需要加上p ...
- Struts2 设置global timer
设置全局的timer需要在web.xml中添加servlet, 并设置load-on-startup 为 1, 然后在servlet的init()中开启timer, 具体代码如下: 1. web.xm ...
- Html_Task4(知识点:水平居中+垂直居中/position/float/border-radius)
任务四:定位和居中问题 任务目标 实践HTML/CSS布局方式 深入了解position等CSS属性 任务描述 实现如 示例图(点击打开) 的效果 灰色元素水平垂直居中,有两个四分之一圆位于其左上角和 ...
- 使用cnpm搭建私有NPM仓库 发布npm包
关于如何使用cnpm搭建私有的npm仓库看这里→ http://blog.fens.me/nodejs-cnpm-npm/ 我本人还没有机会真正实践操作过,公司的npm仓库是我老大搭建的,我这里仅仅记 ...
- collections 模块:更多数据结构
- Spring component-scan 的逻辑 、单例模式下多实例问题、事务失效
原创内容,转发请保留:http://www.cnblogs.com/iceJava/p/6930118.html,谢谢 之前遇到该问题,今天查看了下 spring 4.x 的代码 一,先理解下 con ...
- 每天4亿行SQLite订单大数据测试(源码)
SQLite单表4亿订单,大数据测试 SQLite作为嵌入式数据库的翘楚,广受欢迎!新生命团队自2010年以来,投入大量精力对SQLite进行学习研究,成功应用于各系统非致命数据场合. SQLite极 ...
- 前端向后台的华丽转身 — PHP基础篇
这一次,本K带大家来看一下关于PHP中数组.字符串的一些注意事项和函数(方法). 一.PHP中的数组 (一)PHP中的数组简介 数组类型是PHP两种复合数据类型之一.根据下标的不同,可以将PHP中的数 ...
- 【Windows 10 应用开发】如何防止应用程序被截屏
今天老周只想跟大伙们分享一个小技巧,是的,小小的技巧,很简单,保证你能学会的,要是学不会,可以考虑跳泰山. 有些时候,我们可能会想到不要让应用程序界面上显示的内容被截屏,要阻止应用界面呈现在截图上,可 ...