等待 TIME_WAIT 结束可能是令人恼火的一件事,特别是假如您正在研发一个套接字服务器,就需要停止服务器来做一些改变,然后重启。幸运的是,有方法能够避开 TIME_WAIT 状态。能够给套接字应用 SO_REUSEADDR 套接字选项,以便端口能够马上重用。
考虑清单 3 的例子。在绑定地址之前,我以 SO_REUSEADDR 选项调用 setsockopt。为了允许地址重用,我配置整型参数(on)为 1 (不然,能够设为 0 来禁止地址重用)。
/* 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,
&on, sizeof(on) );/* Allow connections to
port 8080 from any available interface
*/memset( &servaddr, 0, sizeof(servaddr) );
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 *)&servaddr, sizeof(servaddr) );
清单 3.使用 SO_REUSEADDR 套接字选项避免地址使用错误
int sock, ret, on;struct sockaddr_in servaddr;
在应用了 SO_REUSEADDR 选项之后,bind API 函数将允许地址的立即重用。
隐患 4.发送结构化数据
套接字是发送无结构二进制字节流或 ASCII 数据流(比如 HTTP 上的 HTTP 页面,或 SMTP 上的电子邮件)的完美工具。但是假如试图在一个套接字上发送二进制数据,事情将会变得更加复杂。
比如说,您想要发送一个整数:您能够肯定,接收者将使用同样的方式来解释该整数吗?运行在同一架构上的应用程式能够依赖他们一起的平台来对该类型的数据做出相同的解释。但是,假如一个运行在高位优先的 IBM PowerPC 上的客户端发送一个 32 位的整数到一个低位优先的 Intel x86,那将会发生什么呢?字节排列将引起不正确的解释。
通过套接字发送一个 C 结构会怎么样呢?这里,也会碰到麻烦,因为不是任何的编译器都以相同的方式排列一个结构的元素。结构也可能被压缩以便使浪费的空间最少,这进一步使结构中的元素错位。
幸好,有解决这个问题的方案,能够确保两端数据的一致解释。过去,远程过程调用(Remote Procedure Call,RPC)套装工具提供所谓的外部数据表示(External Data Representation,XDR)。XDR 为数据定义一个标准的表示来支持异构网络应用程式通信的研发。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




