`
zsxxsz
  • 浏览: 451152 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用 acl 编写 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/acl-dev/acl

      udp 服务端示例:acl\samples\udp_server

      udp 客户端示例:acl\samples\udp_client

0
0
分享到:
评论

相关推荐

    acl C++跨平台库.rar

    通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、UDP方式、协程方式)的服务器程序,WEB 应用程序,数据库应用程序。此外,该库还提供了常见应用的客户端通信库(如:HTTP、SMTP、...

    路由器防病毒ACL应用研究

    扩展ACL通过同时考虑源IP地址、目的IP地址、传输层协议(如TCP或UDP)以及应用程序端口等信息,实现了更加精细化的数据流控制。这种类型的ACL可以有效防止未经授权的访问,并阻止恶意流量的传播。例如,在校园网的...

    acl-master.zip

    通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、UDP方式)的服务器程序,WEB 应用程序,数据库应用程序。此外,该库还提供了常见应用的客户端通信库(如:HTTP、SMTP、ICMP、redis、...

    acl-master

    通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、UDP方式、协程方式)的服务器程序,WEB 应用程序,数据库应用程序。此外,该库还提供了常见应用的客户端通信库(如:HTTP、SMTP、...

    cpp-acl工程是一个跨平台的网络通信库及服务器编程框架

    acl 工程是一个跨平台(支持LINUX,WIN32,Solaris,MacOS,...通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、UDP方式、协程方式)的服务器程序,WEB 应用程序,数据库应用程序。

    acl 工程是一个跨平台的网络通信库及服务器编程框架,同时提供更多的实用功能库

    通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、UDP方式、协程方式)的服务器程序,WEB 应用程序,数据库应用程序。此外,该库还提供了常见应用的客户端通信库(如:HTTP、SMTP、...

    acl工程是一个跨平台的网络通信库及服务器编程框架,同时提供更多的实用功能库,支持LINUX,WIN32,Solaris,Mac

    通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、UDP方式、协程方式)的服务器程序,WEB 应用程序,数据库应用程序。此外,该库还提供了常见应用的客户端通信库(如:HTTP、SMTP、...

    acl:CC ++为Linux,Mac,FreeBSD,Solaris(x86),Windows,Android,IOS编写的服务器框架和网络组件

    通过该库,用户可以非常容易地编写支持多种模式(多线程,多进程,非二进制,异步,UDP方式,协程方式)的服务器程序,WEB应用程序,数据库应用程序。从而,该库还提供了常用应用的客户端通信库(如:HTTP ,SMTP,...

    linux程序设计(英文版第四版)

    6. **文件描述符与套接字**:讲解文件描述符的概念,以及如何使用它们进行网络通信,包括TCP/IP套接字、UDP套接字和套接字选项。 7. **信号处理**:解释信号在进程控制中的作用,如何安装信号处理函数以及如何正确...

    Linux程序设计权威指南-5.zip

    《Linux程序设计权威指南》是一本深度探讨Linux系统下程序开发的经典著作,旨在帮助开发者全面理解和掌握在Linux环境中编写高效、稳定程序的技巧与方法。Linux作为一种开源操作系统,因其强大的可定制性和稳定性,在...

    经典书籍 :《Linux程序设计权威指南》pdf

    8. **网络编程**:涵盖TCP/IP协议栈,讲解套接字API的使用,包括TCP、UDP和Unix域套接字的创建与操作。 9. **多线程编程**:讨论POSIX线程(pthread)库,包括线程的创建、同步(互斥锁、条件变量)和通信。 10. *...

    vport-geneve.rar_open

    描述中的“Keeps track of open UDP ports”表明该内容可能涉及到一个程序或工具,该程序能够监控和管理运行在系统上的开放UDP端口。UDP是一种无连接的传输层协议,常用于需要快速传输但对数据完整性和顺序不太关心...

    Windows编程三本

    1. **套接字编程**:讲解如何使用Winsock库创建TCP/IP和UDP网络连接,实现客户端和服务端的通信。 2. **HTTP和FTP协议**:可能会介绍如何在Windows下实现基于这些协议的网络应用。 3. **多线程网络编程**:在网络...

    Windows命令行运行程序

    - **`netstat -an`**: 显示网络连接状态,包括 TCP 和 UDP 连接。 - **`net start` 和 `net stop`**: 启动或停止网络服务,如 `messenger` 服务。 #### 2.4 安全性和权限管理 - **`secpol.msc`**: 打开本地安全...

    操作系统实验指导——基于Linux内核(第2版)

    7. 网络编程实验:涉及套接字编程,学生将学习如何创建服务器和客户端,实现TCP/IP和UDP通信。 8. 安全性与权限:介绍Linux的安全模型,如用户和组权限、访问控制列表(ACL),以及防火墙和SELinux等安全策略。 9....

    Linux 编程白皮书

    Linux提供了丰富的网络编程接口,如套接字(socket)API,用于实现TCP/IP和UDP通信。理解网络协议栈、套接字编程模型、客户端服务器模型、错误处理和性能优化是网络编程的核心。 八、权限与安全 Linux有严格的权限...

    新编Windows API参考大全

    6. **网络编程**:涵盖Winsock库,讲解TCP/IP、UDP等网络协议的使用,以及套接字的创建、连接、发送和接收数据等函数。 7. **设备驱动程序**:虽然不是所有开发者都会涉及,但书中可能会简要介绍如何与硬件设备交互...

    Windows Internals, Part 2, 6th Edition

    书中还详细介绍了Windows的驱动程序模型,包括WDK(Windows Driver Kit)的使用、驱动程序的开发流程、调试技巧以及与硬件交互的底层细节。 #### 2. 设备驱动程序和硬件抽象层 在这一章节中,作者们讨论了设备驱动...

    TCP-IP详解卷二:实现

    开发者可以利用socket接口编写应用程序,实现客户端和服务端的通信。Socket编程涉及套接字的创建、绑定、监听、接受连接和数据交换等步骤。 6. **TCP/IP协议层次结构**:TCP/IP模型通常被描述为四层或五层模型,...

    Linux_UNIX系统编程手册

    5. **网络编程**:讲解套接字API,包括TCP/IP、UDP等网络协议,以及服务器和客户端的实现,如socket、bind、listen、accept、connect、send、recv等函数的使用。 6. **多线程编程**:阐述了线程的创建、同步和互斥...

Global site tag (gtag.js) - Google Analytics