我正在尝试将套接字绑定到以下端口:
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
为什么会出现这个错误呢?
该错误通常意味着您试图打开的端口已被另一个应用程序使用。尝试使用netstat查看哪些端口是打开的,然后使用一个可用端口。
还要检查您是否绑定到正确的ip地址(我假设是localhost)
每个人都是正确的。但是,如果您也忙于测试代码,那么如果套接字启动和停止相对较快,那么您自己的应用程序可能仍然“拥有”套接字。尝试将SO_REUSEADDR作为套接字选项:
SO_REUSEADDR到底做什么?
这个套接字选项告诉内核,即使这个端口很忙(处于TIME_WAIT状态),也要继续重复使用它。如果它是忙的,但有另一个状态,您仍然会得到一个地址已经在使用错误。如果您的服务器已关闭,然后在其端口上的套接字仍处于活动状态时立即重新启动,则此操作非常有用。您应该意识到,如果有任何意外的数据进入,它可能会混淆您的服务器,但这是可能的,但不太可能。
有人指出,“套接字是一个5元组(proto,local addr,local port,remote addr,remote port)。SO_REUSEADDR只是说你可以重用本地地址。5元组仍然必须是唯一的!”作者:Michael Hunter(mphunter@qnx.com)。这是正确的,这就是为什么您的服务器不太可能看到意外数据的原因。危险的是,这样一个5元组仍然在网络上四处飘浮,而当它四处飘浮时,来自同一客户端、同一系统上的一个新连接碰巧得到了相同的远程端口。Richard Stevens在“2.7请解释TIME_WAIT状态”中对此进行了解释。