gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:37:52 26 4
gpt4 key购买 nike

我正在尝试将套接字绑定(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.''.

关于c - 绑定(bind)失败 : Address already in use,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15198834/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com