我有一个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行显示&#34;使用中的地址:...&#34;因为前两次连接失败了?
答案 0 :(得分:2)
我认为你对这些套接字操作的作用存在误解。
但我首先需要检查给定端口上是否已存在连接,如果存在,我需要关闭连接。
bind()
为套接字提供本地地址,而不是检查您尝试连接的远程地址是否可访问。
connect()
将套接字连接到远程地址。
将套接字连接为客户端时(我认为您正在尝试这样做),您不需要检查是否已有连接,远程服务器可以处理多个传入客户端连接到同一端口。绑定通常仅对服务器很重要。
如果你在连接之前没有绑定,套接字将被分配一个随机的本地端口。
因此,如果您是客户,请执行以下操作:
socket()
connect()
如果您是服务器,请执行以下操作:
socket()
bind()
listen()
在你自己的问题中,当没有服务器监听时,输出是有意义的,但是服务器上线了。
前两次,你绑定一个套接字并且它成功了,因为没有人用它来监听,然后你连接失败,因为你刚刚绑定,并且没有启动服务器(通过调用listen()
)。
然后同一主机上的真实服务器绑定该套接字并开始监听,因此您不能再绑定该端口(它失败),但您可以连接,因为服务器正在侦听。