浅析LinuxSocket套接字编程中的 5 个隐患( 二 )
等待 TIME_WAIT 结束可能是令人恼火的一件事 , 特别是如果您正在开发一个套接字服务器 , 就需要停止服务器来做一些改动 , 然后重启 。 幸运的是 , 有方法可以避开 TIME_WAIT 状态 。 可以给套接字应用 SO_REUSEADDR 套接字选项 , 以便端口可以马上重用 。
考虑下面的例子 。 在绑定地址之前 , 我以 SO_REUSEADDR 选项调用 setsockopt 。 为了允许地址重用 , 我设置整型参数(on)为 1 (不然 , 可以设为 0 来禁止地址重用) 。
使用 SO_REUSEADDR 套接字选项避免地址使用错误
int sock, ret, on;struct sockaddr_in servaddr;/* Create a new stream (TCP) socket */sock = socket( AF_INET, SOCK_STREAM, 0 ):/* Enable address reuse */on = 1;ret = setsockopt( sock, SOL_SOCKET, SO_REUSEADDR, /* Allow connections to port 8080 from any available interface */memset( servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl( INADDR_ANY );servaddr.sin_port = htons( 45000 );/* Bind to the address (interface/port) */ret = bind( sock, (struct sockaddr *)在应用了 SO_REUSEADDR 选项之后 , bind API 函数将允许地址的立即重用 。
隐患 4.发送结构化数据套接字是发送无结构二进制字节流或 ASCII 数据流(比如 HTTP 上的 HTTP 页面 , 或 SMTP 上的电子邮件)的完美工具 。 但是如果试图在一个套接字上发送二进制数据 , 事情将会变得更加复杂 。
比如说 , 您想要发送一个整数:您可以肯定 , 接收者将使用同样的方式来解释该整数吗?运行在同一架构上的应用程序可以依赖它们共同的平台来对该类型的数据做出相同的解释 。 但是 , 如果一个运行在高位优先的 IBM PowerPC 上的客户端发送一个 32 位的整数到一个低位优先的 Intel x86 , 那将会发生什么呢?字节排列将引起不正确的解释 。
字节交换还是不呢?
Endianness 是指内存中字节的排列顺序 。 高位优先(big endian) 按最高有效字节在前排列 , 然而 低位优先(little endian) 按照最低有效字节在前排序 。
高位优先架构(比如 PowerPC?)比低位优先架构(比如 Intel? Pentium? 系列 , 其网络字节顺序是高位优先)有优势 。 这意味着 , 对高位优先的机器来说 , 在 TCP/IP 内控制数据是自然有序的 。 低位优先架构要求字节交换 —— 对网络应用程序来说 , 这是一个轻微的性能弱点 。
通过套接字发送一个 C 结构会怎么样呢?这里 , 也会遇到麻烦 , 因为不是所有的编译器都以相同的方式排列一个结构的元素 。 结构也可能被压缩以便使浪费的空间最少 , 这进一步使结构中的元素错位 。
幸好 , 有解决这个问题的方案 , 能够保证两端数据的一致解释 。 过去 , 远程过程调用(Remote Procedure Call , RPC)套装工具提供所谓的外部数据表示(External Data Representation , XDR) 。 XDR 为数据定义一个标准的表示来支持异构网络应用程序通信的开发 。
现在 , 有两个新的协议提供相似的功能 。 可扩展标记语言/远程过程调用(XML/RPC)以 XML 格式安排 HTTP 上的过程调用 。 数据和元数据用 XML 进行编码并作为字符串传输 , 并通过主机架构把值和它们的物理表示分开 。 SOAP 跟随 XML-RPC , 以更好的特性和功能扩展了它的思想 。
隐患 5.TCP 中的帧同步假定TCP 不提供帧同步 , 这使得它对于面向字节流的协议是完美的 。 这是 TCP 与 UDP(User Datagram Protocol , 用户数据报协议)的一个重要区别 。 UDP 是面向消息的协议 , 它保留发送者和接收者之间的消息边界 。 TCP 是一个面向流的协议 , 它假定正在通信的数据是无结构的 , 如图 1所示 。
UDP 的帧同步能力和缺乏帧同步的 TCP
推荐阅读
- vue2.x与vue3.x语法对比浅析
- USB接口中的皇帝!浅析雷电Thunderbolt的前生今世
- 浅析人工智能在行政领域的应用及其风险规制
- Python基础变量类型——List浅析
- 天猫入驻|天猫入驻:知舟集团浅析买天猫店好还是入驻好
