我正在尝试将套接字绑定到以下端口:
if( bind(socket_desc,(struct sockaddr *) &server, sizeof(server)) < 0)
{
perror("bind failed. Error");
return 1;
}
puts("bind done");
但它给出了:
$ ./serve
Socket created
bind failed. Error: Address already in use
为什么会出现这个错误?
每个人都是对的。但是,如果您还忙于测试您的代码own如果应用程序启动和停止相对较快,则它可能仍然“拥有”套接字。尝试SO_REUSEADDR http://www.unixguide.net/network/socketfaq/4.5.shtml作为套接字选项:
SO_REUSEADDR 到底做了什么?
这个套接字选项告诉内核即使这个端口很忙(在
TIME_WAIT 状态),无论如何都可以重用它。如果很忙的话
但在另一个州,您仍然会得到一个已在使用的地址
错误。如果您的服务器已关闭,然后再
当套接字在其端口上仍处于活动状态时立即重新启动。你
应该注意的是,如果有任何意外的数据进来,可能会造成混乱
您的服务器,但是虽然这是可能的,但可能性不大。
有人指出“套接字是一个 5 元组(原始、本地
地址、本地端口、远程地址、远程端口)。 SO_REUSEADDR 只是说
您可以重复使用本地地址。 5元组仍然必须是
独一无二!”作者:迈克尔·亨特([电子邮件受保护] /cdn-cgi/l/email-protection)。这是真的,而且这个
这就是为什么人们不太可能看到意外数据的原因
你的服务器。危险在于这样的5元组仍然是浮动的
在网络上四处传播,当它四处跳跃时,一个新的连接
来自同一个客户端,在同一个系统上,碰巧得到了相同的结果
远程端口。理查德·史蒂文斯 (Richard Stevens) 在《2.7 请》中解释了这一点
解释一下 TIME_WAIT 状态。''。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)