原文:http://hi.baidu.com/liaimin/blog/item/07f1fdfa521ff0dbb58f315f.html
在以前的文章中,我曾经引用过一篇端口重用与端口独占程序设计。但是,后来我发现其中有一点写的不清楚,为清视听,善意为作者添加一点.
setsockopt()中的第四个参数是端口重用与否的标志,为1则可重用,否则,禁止重用。所以,上面那篇文章应该加一句:cflag=1;
隐患 3.地址使用错误(EADDRINUSE)
您 可以使用 bind API
函数来绑定一个地址(一个接口和一个端口)到一个套接字端点。可以在服务器设置中使用这个函数,以便限制可能有连接到来的接口。也可以在客户端设置中使用
这个函数,以便限制应当供出去的连接所使用的接口。bind
最常见的用法是关联端口号和服务器,并使用通配符地址(INADDR_ANY),它允许任何接口为到来的连接所使用。
bind 普遍遭遇的问题是试图绑定一个已经在使用的端口。该隐患是也许没有活动的套接字存在,但仍然禁止绑定端口(bind 返回
EADDRINUSE),它由 TCP 套接字状态 TIME_WAIT 引起。该状态在套接字关闭后约保留 2 到 4 分钟。在 TIME_WAIT
状态退出之后,套接字被删除,该地址才能被重新绑定而不出问题。
等待 TIME_WAIT
结束可能是令人恼火的一件事,特别是如果您正在开发一个套接字服务器,就需要停止服务器来做一些改动,然后重启。幸运的是,有方法可以避开
TIME_WAIT 状态。可以给套接字应用 SO_REUSEADDR 套接字选项,以便端口可以马上重用。
考虑清单 3 的例子。在绑定地址之前,我以 SO_REUSEADDR 选项调用 setsockopt。为了允许地址重用,我设置整型参数(on)为
1 (不然,可以设为 0 来禁止地址重用)。
清单 3.使用 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, &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) );
在应用了 SO_REUSEADDR 选项之后,bind API 函数将允许地址的立即重用。
分享到:
相关推荐
这在尝试进行TCP NAT穿Kong时非常重要,这需要一个过程在同一TCP端口上进行侦听和拨号。 该软件包提供了一些实用程序,可在各种操作系统上启用此行为。例子// listen on the same port. oh yeah.l1 , _ := reuse . ...
另外一种NAT叫做NAPT,从名称上我们也可以看得出,NAPT不但会改变经过这个NAT设备的IP数据报的IP地址,还会改变IP数据报的TCP/UDP端口。基本NAT的设备可能我们见的不多(呵呵,我没有见到过),NAPT才是我们真正...
NAT(Network Address Translators),网络地址... 另外一种NAT叫做NAPT,从名称上我们也可以看得出,NAPT不但会改变经过这个NAT设备的IP数据报的IP地址,还会改变IP数据报的TCP/UDP端口。基本NAT的设备可能我们见的不多
#设置正常情况退出的服务器下,端口可以重用 #设置监听,变为主动监听 # 等待客户端的链接,返回新的socket和地址 #关闭tcp服务器套接字 from socket import socket, AF_INET,SOCK_STREAM,SOL_SOCK
强大的扩展功能,一切可用(缓存,压缩,加密,流量限制,带宽限制,端口重用等) 域名解析具有诸如自定义标题,404页面配置,主机修改,站点保护,URL路由和全景解析之类的功能。 服务器上的多用户和用户注册...
SO_REUSEPORT端口重用支持 自动清理空闲连接 支持WebSocket / Protobuf 支持计划任务,延迟任务 支持自定义协议 网络模型 gev仅使用一些goroutine,其中一个侦听连接,而另一个(工作协程)处理已连接客户端的读取...
请参阅中文。请参见中文。Wiki简介CppNet是一种proactor模式和多线程网络,在tcp上具有C ++ 11。...快速:使用epoll和IOCP,其中epoll多线程线程由Linux内核通过端口重用进行处理。 每个插槽都有一个记忆
344 /*获取端口重用信息*/ 345 if (INET_PROTOSW_REUSE & answer_flags) 346 sk->sk_reuse = 1; 5. 364 *初始化接受与发送队列相关的信息,传输控制块 366 sock_init_data(sock, sk);在这里应当注意,这个是...
Socket类添加ReUseAddr函数,用来设置端口重用 TCPSocket接口类添加GetListener接口用来获得链接管理对象 修改Demo实例中的TCP客户端部分,增加可更改客户端连接数 2.4 添加UDT支持 修改UDPChannel接口类,添加...
解除绑定是简单的命令行工具,可让您在服务器崩溃后立即重用指定的TCP端口。 您不需要等待2分钟,之后内核会自动释放端口。 在调试服务器崩溃时很有用。
13.2.3 重用服务器子进程 本章小结 第十四章 原始套接字编程实践 14.1 原始套接字 14.1.1 原始套接字的创建 14.1.2 原始套接字的使用 14.1.3 IP包头和ICMP报文的C语言描述 14.2 ...
包括TCP与UDP两种协议的IOCP封装实现。比较好的解决了掉线,死机,超时等socket关闭问题及WAIT_TIME问题。同时用较好方式实现了AcceptContext,ReceiveContext,Sendcontext的管理(自己写了个static类),重用各种...
快速:使用epoll和IOCP,其中epoll多线程线程由Linux内核通过端口重用进行处理。 每个套接字都有一个内存池对象。 从内存池请求的所有内存都由智能指针管理。 清除:三层:事件驱动层,会话管理层和接口层,通过各...
增强程序的可重用性 STML是通用的 FETD是和底层采用的通讯协议(TCP/IP、Fibre channel)相关的 STML提供给FETD的API register_target_template() deregister_target_template() register_target_front_end() ...
程序可以采用 JAVA 开发,但是因为它的虚拟机 (Virtual Machine) Dalvik ,是将 JAVA 的 bytecode 转成 自 己的格式,回避掉需要付给 SUN 有关 JAVA 的授权费用。 对手机制造者的影响 � Android 是款开源的移动计算...
其缺省的名称为 LISTENER 这个监听器缺省以tcp/ip为协议地址且端口号为1521运行 在CAMS应用中 监听文件定义的监听器就使用这个缺省名字 并且使用缺省的协议 tcp/ip 和缺省的端口号 1521 待配置好监听文件...
第1 章Linux操作系统概述................... .......................................................................... 2 1.1 Linux发展历史...........................................................
(ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)(PORT=5000)(HOST=zeus)) (ADDRESS=(PROTOCOL=decnet)(OBJECT=outa)(NODE=zeus)) 此参数在 8.1.3 版中已废弃。 值范围: TRUE | FALSE 默认值: FALSE mts_servers: 说明 : ...
目录 引言 ...................................................................................................................................... I 第一章程序和程序设计 ...............................