c - 绑定(bind)失败 : Address already in use

我正在尝试将套接字绑定(bind)到以下端口:

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

为什么会出现这个错误?

最佳答案

每个人都是正确的。但是,如果您还忙于测试您的代码,那么您的 自己的 应用程序可能仍然“拥有”套接字,如果它启动和停止相对较快的话。试试 SO_REUSEADDR作为套接字选项:

What exactly does SO_REUSEADDR do?

This socket option tells the kernel that even if this port is busy (in the TIME_WAIT state), go ahead and reuse it anyway. If it is busy, but with another state, you will still get an address already in use error. It is useful if your server has been shut down, and then restarted right away while sockets are still active on its port. You should be aware that if any unexpected data comes in, it may confuse your server, but while this is possible, it is not likely.

It has been pointed out that "A socket is a 5 tuple (proto, local addr, local port, remote addr, remote port). SO_REUSEADDR just says that you can reuse local addresses. The 5 tuple still must be unique!" by Michael Hunter (mphunter@qnx.com). This is true, and this is why it is very unlikely that unexpected data will ever be seen by your server. The danger is that such a 5 tuple is still floating around on the net, and while it is bouncing around, a new connection from the same client, on the same system, happens to get the same remote port. This is explained by Richard Stevens in ``2.7 Please explain the TIME_WAIT state.''.

https://stackoverflow.com/questions/15198834/

相关文章:

c - Linux上C中的标准输出线程安全?

linux - 如何设置 cron 在特定时间只运行一次文件?

linux - 适用于 Linux 和 Mac 的 HTTP 调试代理

linux - 如何测试是否存在两个文件?

java - Ubuntu 上 Java 应用程序中的丑陋字体

linux - Hadoop:«错误:未设置 JAVA_HOME»

python - 如何从 subprocess.Popen() 获取输出。 proc.stdout.

c++ - 在 Linux 中显式导出共享库函数

linux - 在 bash 脚本中使用 curl 并获取 curl : (3) Illegal c

linux - 查看 linux 上的多核或多 CPU 利用率