在当今网络世界,虽然大部分网络应用都是基于 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
相关推荐
通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、UDP方式、协程方式)的服务器程序,WEB 应用程序,数据库应用程序。此外,该库还提供了常见应用的客户端通信库(如:HTTP、SMTP、...
扩展ACL通过同时考虑源IP地址、目的IP地址、传输层协议(如TCP或UDP)以及应用程序端口等信息,实现了更加精细化的数据流控制。这种类型的ACL可以有效防止未经授权的访问,并阻止恶意流量的传播。例如,在校园网的...
通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、UDP方式)的服务器程序,WEB 应用程序,数据库应用程序。此外,该库还提供了常见应用的客户端通信库(如:HTTP、SMTP、ICMP、redis、...
通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、UDP方式、协程方式)的服务器程序,WEB 应用程序,数据库应用程序。此外,该库还提供了常见应用的客户端通信库(如:HTTP、SMTP、...
acl 工程是一个跨平台(支持LINUX,WIN32,Solaris,MacOS,...通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、UDP方式、协程方式)的服务器程序,WEB 应用程序,数据库应用程序。
通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、UDP方式、协程方式)的服务器程序,WEB 应用程序,数据库应用程序。此外,该库还提供了常见应用的客户端通信库(如:HTTP、SMTP、...
通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、UDP方式、协程方式)的服务器程序,WEB 应用程序,数据库应用程序。此外,该库还提供了常见应用的客户端通信库(如:HTTP、SMTP、...
通过该库,用户可以非常容易地编写支持多种模式(多线程,多进程,非二进制,异步,UDP方式,协程方式)的服务器程序,WEB应用程序,数据库应用程序。从而,该库还提供了常用应用的客户端通信库(如:HTTP ,SMTP,...
6. **文件描述符与套接字**:讲解文件描述符的概念,以及如何使用它们进行网络通信,包括TCP/IP套接字、UDP套接字和套接字选项。 7. **信号处理**:解释信号在进程控制中的作用,如何安装信号处理函数以及如何正确...
《Linux程序设计权威指南》是一本深度探讨Linux系统下程序开发的经典著作,旨在帮助开发者全面理解和掌握在Linux环境中编写高效、稳定程序的技巧与方法。Linux作为一种开源操作系统,因其强大的可定制性和稳定性,在...
8. **网络编程**:涵盖TCP/IP协议栈,讲解套接字API的使用,包括TCP、UDP和Unix域套接字的创建与操作。 9. **多线程编程**:讨论POSIX线程(pthread)库,包括线程的创建、同步(互斥锁、条件变量)和通信。 10. *...
描述中的“Keeps track of open UDP ports”表明该内容可能涉及到一个程序或工具,该程序能够监控和管理运行在系统上的开放UDP端口。UDP是一种无连接的传输层协议,常用于需要快速传输但对数据完整性和顺序不太关心...
1. **套接字编程**:讲解如何使用Winsock库创建TCP/IP和UDP网络连接,实现客户端和服务端的通信。 2. **HTTP和FTP协议**:可能会介绍如何在Windows下实现基于这些协议的网络应用。 3. **多线程网络编程**:在网络...
- **`netstat -an`**: 显示网络连接状态,包括 TCP 和 UDP 连接。 - **`net start` 和 `net stop`**: 启动或停止网络服务,如 `messenger` 服务。 #### 2.4 安全性和权限管理 - **`secpol.msc`**: 打开本地安全...
7. 网络编程实验:涉及套接字编程,学生将学习如何创建服务器和客户端,实现TCP/IP和UDP通信。 8. 安全性与权限:介绍Linux的安全模型,如用户和组权限、访问控制列表(ACL),以及防火墙和SELinux等安全策略。 9....
Linux提供了丰富的网络编程接口,如套接字(socket)API,用于实现TCP/IP和UDP通信。理解网络协议栈、套接字编程模型、客户端服务器模型、错误处理和性能优化是网络编程的核心。 八、权限与安全 Linux有严格的权限...
6. **网络编程**:涵盖Winsock库,讲解TCP/IP、UDP等网络协议的使用,以及套接字的创建、连接、发送和接收数据等函数。 7. **设备驱动程序**:虽然不是所有开发者都会涉及,但书中可能会简要介绍如何与硬件设备交互...
书中还详细介绍了Windows的驱动程序模型,包括WDK(Windows Driver Kit)的使用、驱动程序的开发流程、调试技巧以及与硬件交互的底层细节。 #### 2. 设备驱动程序和硬件抽象层 在这一章节中,作者们讨论了设备驱动...
开发者可以利用socket接口编写应用程序,实现客户端和服务端的通信。Socket编程涉及套接字的创建、绑定、监听、接受连接和数据交换等步骤。 6. **TCP/IP协议层次结构**:TCP/IP模型通常被描述为四层或五层模型,...
5. **网络编程**:讲解套接字API,包括TCP/IP、UDP等网络协议,以及服务器和客户端的实现,如socket、bind、listen、accept、connect、send、recv等函数的使用。 6. **多线程编程**:阐述了线程的创建、同步和互斥...