gpt4 book ai didi

c++ - 即使没有建立连接,绑定(bind)也会返回正在使用的地址

转载 作者:行者123 更新时间:2023-11-28 02:45:47 24 4
gpt4 key购买 nike

我有一个 C++ 代码,我在其中尝试在套接字上建立连接。但是我首先需要检查给定端口上是否已经存在连接,如果存在我需要关闭连接。我有下面的代码,我的问题是,当检查端口是否已经连接时,它会返回它,即使之前连接失败。

connected = false;
int sockfd;
void conn(int port) {
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
.....
int sockfd_t;
if ( (sockfd_t = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
cout << "Error opening socket_test " << endl;
return;
}
// check if address already in use
if (bind(sockfd_t, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
if(errno == EADDRINUSE) {
cout << "address in use: bind fail, port=" << port << endl;
}
// do something - close the connection if already connected
}
else {
cout << "bind ok, port=" << port << endl;
}
close(sockfd_t);

if ( (sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
cout << "Error opening socket " << endl;
return;
}

if (connect(sockfd, (struct sockaddr *) &adresse, sizeof(adresse))) {
cout << "Error connecting" << endl;
close(sockfd);
return;
}

connected = true;
}

int main() {
int port=3590;
while (!connected) {
conn(port);
}
cout << "CONNECTED";
// ..........
}

运行程序后,这是打印的输出:

bind ok, port=3590;
Error connecting
bind ok, port=3590;
Error connecting
address in use: bind fail, port=3590 //???
CONNECTED!

我不知道为什么在打印的第 5 行显示“address in use:...”,因为前两次连接失败?

最佳答案

我认为您对这些套接字操作的作用有误解。

But I firstly need to check if a connection already exist on a given port, and if it exists I need to close the connection.

  1. bind() 为套接字提供一个本地地址,而不是检查您尝试连接的远程地址是否可访问.

  2. connect() 将套接字连接到一个远程地址

  3. 当连接套接字作为客户端时(这是我认为你正在尝试做的),你不需要检查是否已经存在连接,远程服务器可以处理多个传入客户端连接到同一端口。绑定(bind)通常只对服务器很重要。

  4. 如果您在连接前不绑定(bind),套接字将被分配一个随机的本地端口。

因此,如果您是客户,您会:

  1. 套接字()
  2. connect()

如果您是服务器,您会:

  1. 套接字()
  2. 绑定(bind)()
  3. listen()

在您自己的问题中,当没有服务器在监听但随后服务器上线时,输出有意义。

  1. 前两次,你绑定(bind)了一个套接字并且成功了,因为没有人用它来监听,然后你连接失败了,因为你只是绑定(bind)了,并没有启动服务器(通过调用 listen ()).

  2. 然后同一主机上的真实服务器绑定(bind)该套接字并开始监听,因此您不能再绑定(bind)该端口(失败),但您可以连接,因为服务器正在监听。

关于c++ - 即使没有建立连接,绑定(bind)也会返回正在使用的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24488391/

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