使用 acl 编写 UDP 网络程序(UDP 重传及可靠性机制)
在当今网络世界,虽然大部分网络应用都是基于 TCP 的,但有时 UDP 的网络通信也有用武之处。acl 的网络库中不仅提供了基于 TCP 的网络套接字流,同时也提供了 UDP 的网络库(目前 acl 库的网络部分仅提供了基本的 UDP 功能,如果想实现 UDP 重传及可靠性机制,大家可以参考 udt --https://sourceforge.net/projects/udt/ 库)。
使用 acl 网络库无论编写客户端还是服务器程序,都需要首先调用 acl_vstream_bind 接口绑定本机地址,该函数的定义如下:
/**
* 针对 UDP 通信,该函数用来绑定本地 UDP 地址,如果绑定成功,则创建
* ACL_VSTREAM 对象, 用户可以象调用 ACL_VSTREAM 对象的读写接口
* @param addr {const char*} 本地 UDP 地址,格式:ip:port
* @param rw_timeout {int} 读写超时时间(秒)
* @return {ACL_VSTREAM*} 返回 NULL 表示绑定失败
*/
ACL_API ACL_VSTREAM *acl_vstream_bind(const char *addr, int rw_timeout);
然后就可以调用 acl_vstream_read/acl_vstream_write 两个函数以 UDP 方式进行网络数据的读写了,因为 UDP 传输是不保证顺序及可靠性的,所以 acl 网络库中的其它读写函数就不被用在 UDP 读写操作中。
下面一个简单的 UDP 服务端程序:
static void udp_server(void)
{
const char *addr = "127.0.0.1:1088";
char buf[4096];
int ret;
ACL_VSTREAM *stream = acl_vstream_bind(addr, 0); /* 绑定 UDP 套接口 */
if (stream == NULL) {
printf("acl_vstream_bind %s error %s\r\n", addr, acl_last_serror());
return;
}
printf("bind udp addr %s ok\r\n", addr);
while (1) {
/* 等待客户端数据 */
ret = acl_vstream_read(stream, buf, sizeof(buf) - 1);
if (ret == ACL_VSTREAM_EOF) {
printf("acl_vstream_read error %s\r\n", acl_last_serror());
break;
}
/* 输出服务器绑定地址及远程客户端地址 */
printf("local addr: %s, peer addr: %s, total: %d\r\n",
ACL_VSTREAM_LOCAL(stream), ACL_VSTREAM_PEER(stream), i);
/* 回写数据至客户端 */
ret = acl_vstream_write(stream, buf, ret);
if (ret == ACL_VSTREAM_EOF) {
printf("acl_vtream_writen error %s\r\n", acl_last_serror());
break;
}
}
/* 关闭 UDP 套接字 */
acl_vstream_close(stream);
}
使用 acl 编写的 UDP 客户端示例如下:
static void udp_client(void)
{
const char *local_addr = "127.0.0.1:1089"; /* 本客户端绑定的地址 */
const char *peer_addr = "127.0.0.1:1088"; /* 服务端绑定的地址 */
int i, ret, dlen;
char buf[1024], data[1024];
ACL_VSTREAM *stream = acl_vstream_bind(local_addr, 2); /* 绑定 UDP 套接口 */
if (stream == NULL) {
printf("acl_vstream_bind %s error %s\r\n",
local_addr, acl_last_serror());
return;
}
memset(data, 'X', sizeof(data);
dlen = sizeof(data);
for (i = 0; i < 100; i++) {
/* 每次写时需要设定服务端地址 */
acl_vstream_set_peer(stream, peer_addr);
/* 向服务端写入数据包 */
ret = acl_vstream_write(stream, data, dlen);
if (ret == ACL_VSTREAM_EOF) {
printf("acl_vtream_writen error %s\r\n",
acl_last_serror());
break;
}
/* 从服务端读取数据 */
ret = acl_vstream_read(stream, buf, sizeof(buf));
if (ret == ACL_VSTREAM_EOF) {
printf("acl_vstream_read error %s\r\n",
acl_last_serror());
break;
}
}
/* 关闭客户端 UDP 套接字 */
acl_vstream_close(stream);
}
由以上两个例子可以看出,使用 acl 网络库编写 UDP 程序也是非常简单的,但有几点需要注意:
1、虽然 acl 网络库中的 UDP 功能也借用 ACL_VSTREAM 结构定义及 acl_vstream_xxx 等接口定义,但 UDP 传输依然是数据包式(即非流式),所以 acl 网络库中的有关 TCP 的使用方法在 UDP 中并不适合(如:acl_vstream_readn, acl_vstream_gets);
2、UDP 传输不保证顺序性及可靠性,所以 acl 网络库在绑定 UDP 端口时允许用户指定读超时时间;
3、使用 acl 网络库编写 UDP 客户端时,在每次向服务端写数据时,最好每次都先通过 acl_vstream_set_peer 设定服务端绑定地址。
参考:
acl 项目下载地址:https://sourceforge.net/projects/acl/
svn:svn://svn.code.sf.net/p/acl/code/trunk acl-code
github:https://github.com/zhengshuxin/acl
udp 服务端示例:acl\samples\udp_server
udp 客户端示例:acl\samples\udp_client
https://my.oschina.net/u/568966/blog/309529
使用 acl 编写 UDP 网络程序(UDP 重传及可靠性机制)的更多相关文章
- udp网络程序-发送、接收数据
1. udp网络程序-发送数据 创建一个基于udp的网络程序流程很简单,具体步骤如下: 创建客户端套接字 发送/接收数据 关闭套接字 代码如下: #coding=utf-8from socket im ...
- UDP网络程序模型设计
UDP网络程序设计 1. UDP网络编程模型程序初始化 1.1服务器使用的函数 创建socket----->socket 绑定地址-------->bind 接受数据--------> ...
- UDP网络程序,客户端和服务端交互原理
创建一个udp客户端程序的流程是简单,具体步骤如下: 创建客户端套接字 发送/接收数据 关闭套接字 UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实 ...
- UDP网络程序实例
根据前面所讲的网络编程的基础知识,以及UDP网络编程的特点,下面创建一个广播数据报程序.广播数据报是一种较新的技术,类似于电台广播,广播电台需要在指定的波段和频率上广播信息,收听者也要将收音机调到指定 ...
- UDP 网络程序-发送_接收数据
""" 创建udp连接 发送数据给 """ from socket import * # 创建udp套接字,使用SOCK_DGRAM udp ...
- Python复习笔记(六)网络编程(udp/tcp)
一.网络-udp(用户数据报协议) 用户数据报协议 类似写信,不安全,数据有可能丢 1.1 ip地址 注意: IP地址127.0.0.1 ~ 127.255.255.255 用于回路测试 私有ip地址 ...
- Java之网络编程UDP和TCP
注*部分转来的 第1章 网络通信协议 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样.在计算机网 ...
- 网络编程——UDP协议和通信
第1章 UDP与TCP协议 在介绍TCP/IP结构时,提到传输层的两个重要的高级协议,分别是UDP和TCP,其中UDP是User Datagram Protocol的简称,称为用户数据报协议,TCP是 ...
- python网络编程-udp
目录 1. 创建socket 2. udp网络程序-发送数据 3. udp网络程序-接收数据 4. python3中的编码转换 5. udp端口绑定 1. 创建socket 在 Python 中 使用 ...
随机推荐
- vim note (2)
:e edit :edit edit :e. edit current file '.' a dot is means current : w writ ...
- error: expected declaration or statement at end of input----solved
error: expected declaration or statement at end of input 解决方法: 1.程序缺少一个括号相应地 2.而不添加头文件 版权声明:本文博主原创文章 ...
- [演示示例程序]Objective-C受委托的设计模式(牛仔女孩)
今天整理电脑打开一次自我Objective-C当编写一个实践设计模式委托一个小程序,在po快来分享.也复习一下OC中的托付. Objective-C中的托付设计模式是和协议分不开的. 协议呢.就是使用 ...
- 深入理解ArrayList与LinkedList的区别
一.先来看看ArrayList与LinkedList 在JDK中所在的位置 从图中可以看出,ArrayList与LinkedList都是List接口的实现类,因此都实现了List的所有未实现的方法,只 ...
- vcmi(魔法门英雄无敌3 - 开源复刻版) 源码编译
vcmi源码编译 windows+cmake+mingw ##1 准备 HoMM3 gog.com CMake 官网 vcmi 源码 下载 QT5 with mingw 官网 Boost 源码1.55 ...
- uwp - 上滑隐藏导航栏下滑显示
原文:uwp - 上滑隐藏导航栏下滑显示 好久没写博客了,因为忙着工作.昨天周末填坑需要做一个上滑列表数据时隐藏导航栏下滑时显示的效果,下面分享一下我的做法,希望能给你带来帮助. 思路是通过判断滚动条 ...
- vcl控件经常使用属性和方法
TTabControl属性 DisplayRect:仅仅定该控件客户区的一个矩形 HotTrack:设置当鼠标经过页标签时,它的字是否有变化.假设为True,是字会变成蓝色Images:为每一个页标签 ...
- C++ Primer Plus的若干收获--(十一)
本篇主要讲了转换函数的利与弊以及简要介绍流与iostream文件 因为在本篇仍然要使用上篇的Stonewt类,这里首先给出其代码 <span style="font-size:18px ...
- 机器学习:深入理解LSTM网络 (二)
之前我们介绍了RNN 网络结构以及其所遇到的问题,RNN 结构对于关联度太长的时序问题可能无法处理, 简单来说,RNN对于太久远的信息不能有效地储存,为了解决这个问题,有人提出了LSTM的网络结构,L ...
- 操作系统hosts文件
为了便于北京和大连两个更好的测试系统.该公司专门申请一个域名:大连r \\ u0026 D侧只需要部署(我方系统全权负责在大连研发.所以在大连并列比较的部署方面easy--不要忘记,该项目比我们实际做 ...