Bind返回正在使用的地址,即使没有建立连接
bind returns address in use even if no connection is established
我有一个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行它显示"地址在使用:…"作为连接失败的前两次?
我想你对这些套接字操作的作用有误解。
但是我首先需要检查在给定端口上是否已经存在连接,如果存在,我需要关闭连接
-
bind()
给套接字一个本地地址,而不是检查您试图连接的远程地址是否可访问。 -
connect()
将套接字连接到远端地址 -
当连接一个套接字作为客户端(这是我认为你正在尝试做的),你不需要检查是否已经有一个连接,远程服务器可以处理多个传入的客户端连接到同一端口。
-
如果你在连接之前没有绑定,socket将被分配一个随机的本地端口。
所以,如果你是一个客户端,你做:
-
socket()
-
connect()
如果您是服务器,您可以:
-
socket()
-
bind()
-
listen()
在您自己的问题中,当没有服务器侦听时,输出是有意义的,但随后服务器联机。
-
前两次,你绑定一个套接字,它是成功的,因为没有人使用它来监听,然后你连接失败,因为你只是绑定,并没有启动服务器(通过调用
listen()
)。 -
然后同一主机上的真实服务器绑定该套接字并开始侦听,因此您不能再绑定该端口(它失败了),但是您可以连接,因为服务器正在侦听。
相关文章:
- 无法在C++中建立与MySQL数据库的连接
- OSX蓝牙打开RFCOMMChannelAsync声称已连接,但未建立连接,并且从未调用过委托
- 通过单独的 tcp 流建立 http 连接
- 将"libpqxx"与Visual Studio 2013链接/安装,以便与PostgrSQL建立C++连接
- Qt:如何通知对象已建立涉及它的信号槽连接
- 从 NAT 后面建立对等连接
- 提升 Websocket 并io_context可重用性,以实现连接的可重新建立性
- 仅通过建立一次TCP连接将Recv从客户端发送到服务器套接字
- 在Windows -C 中未建立的TCP连接
- 我无法在用C++编写的服务器和用 C# 编写的客户端之间建立 UDP 连接
- NAS(使用 qt/linux)- 无法建立简单的音频服务器连接测试
- 使用Isringstream和struct/vector在给定的数据之间建立连接
- C++ MySQL,使用在同一类内的另一个函数中的一个函数中建立的连接
- Adafruit Fona与echo服务器建立连接,但不发送任何数据
- C++ SFML 网络:无法建立 TCP 连接
- 使用 C++ 在 Windows 上建立蓝牙连接(收到错误 10060)
- 如何与SQL Server 2008建立稳定的连接,并在C 中编码我的第一个CRUD操作
- 在 Asio 中建立新连接时出现"Already Open"错误
- 获取在C++中建立TCP连接的正在运行的进程
- C++ 在基于 UNIX 套接字的客户端程序中 connect() 不会建立与服务器的连接