尝试在 TCP 中多次连接()
Trying to connect() multiple times in TCP
我正在编写一个 client/server 应用程序,其中客户端和服务器应通过 TCP 套接字相互发送数据。客户端应该连接到服务器,如果连接失败,它应该等待几秒钟,然后再次尝试连接(最多尝试一定次数)。
这是我目前拥有的代码:
const int i_TRIES = 5;
time_t t_timeout = 3000;
int i_port = 5678;
int i_socket;
string s_IP = "127.0.0.1";
for(int i = 0; i < i_TRIES; i++)
{
if((i_socket = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
cout << "[Client]: Socket creation failed." << endl;
exit(EXIT_FAILURE);
}
memset(&server_address, '0', sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_port = htons(i_port);
if(inet_pton(AF_INET, s_IP.c_str(), &server_address.sin_addr) <= 0)
{
cout << "[Client]: Invalid IP address." << endl;
exit(EXIT_FAILURE);
}
if(connect(i_socket, (struct sockaddr *)&server_address, sizeof(server_address)) < 0)
{
if(i < i_TRIES - 2)
{
cout << "[Client]: Connection to server failed. Trying again in " << t_timeout << " ms." << endl;
close(i_socket);
sleep(t_timeout);
}
else
{
cout << "[Client]: Could not connect to server, exiting." << endl;
exit(EXIT_FAILURE);
}
}
else
{
cout << "[Client]: Successfully connected to server." << endl;
break;
}
}
// do stuff with socket
我遇到的问题是第一次调用 connect() 按预期工作,如果没有服务器则失败,然后循环重复,但是,第二次 connect() 永远阻塞(或至少比我想要的要长得多)。最初,我的循环只是围绕 connect() if 块(下面的代码),这也导致了同样的问题。之后,我将整个套接字设置(上面的代码)包含在循环中,但这也没有帮助。我还尝试在连接失败后关闭套接字,但这也无济于事。
循环初始值:
// other stuff from above here
for(int i = 0; i < i_TRIES; i++)
{
if(connect(i_socket, (struct sockaddr *)&server_address, sizeof(server_address)) < 0)
{
if(i < i_TRIES - 2)
{
cout << "[Client]: Connection to server failed. Trying again in " << t_timeout << " ms." << endl;
sleep(t_timeout);
}
else
{
cout << "[Client]: Could not connect to server, exiting." << endl;
exit(EXIT_FAILURE);
}
}
else
{
cout << "[Client]: Successfully connected to server." << endl;
break;
}
}
// do stuff with socket
我可以在一定时间后强制 connect() 到 return 吗?或者有没有办法让 connect() 函数自己尝试多次?或者在我重试之前我需要对套接字做些什么来重置所有东西吗?我希望这不是一个愚蠢的问题,我找不到任何关于如何多次连接的信息。
提前致谢!
将socket设置为non-blocking模式,使用select()
实现超时。 Select 用于套接字上的可写性。请注意,您可以通过这种方式减少平台连接超时,但不能增加它。
sleep()
毫无意义,简直就是浪费时间。
Can I force connect()
to return after a certain amount of time has passed?
没有。您必须将套接字置于 non-blocking 模式,然后在等待套接字连接时使用 select()
或 (e)poll()
提供超时逻辑。如果连接失败,或者连接时间太长,请关闭套接字,创建一个新套接字,然后重试。
Or is there a way to get the connect()
function to try multiple times on it's own?
没有。每次调用只能执行 1 次连接尝试。
Or is there something I need to do to the socket to reset everything before I can try again?
无法保证您甚至可以在同一个套接字上多次调用 connect()
。在某些平台上,您必须在再次调用 connect()
之前销毁套接字并创建一个新套接字。您应该养成对所有平台都这样做的习惯。
我正在编写一个 client/server 应用程序,其中客户端和服务器应通过 TCP 套接字相互发送数据。客户端应该连接到服务器,如果连接失败,它应该等待几秒钟,然后再次尝试连接(最多尝试一定次数)。
这是我目前拥有的代码:
const int i_TRIES = 5;
time_t t_timeout = 3000;
int i_port = 5678;
int i_socket;
string s_IP = "127.0.0.1";
for(int i = 0; i < i_TRIES; i++)
{
if((i_socket = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
cout << "[Client]: Socket creation failed." << endl;
exit(EXIT_FAILURE);
}
memset(&server_address, '0', sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_port = htons(i_port);
if(inet_pton(AF_INET, s_IP.c_str(), &server_address.sin_addr) <= 0)
{
cout << "[Client]: Invalid IP address." << endl;
exit(EXIT_FAILURE);
}
if(connect(i_socket, (struct sockaddr *)&server_address, sizeof(server_address)) < 0)
{
if(i < i_TRIES - 2)
{
cout << "[Client]: Connection to server failed. Trying again in " << t_timeout << " ms." << endl;
close(i_socket);
sleep(t_timeout);
}
else
{
cout << "[Client]: Could not connect to server, exiting." << endl;
exit(EXIT_FAILURE);
}
}
else
{
cout << "[Client]: Successfully connected to server." << endl;
break;
}
}
// do stuff with socket
我遇到的问题是第一次调用 connect() 按预期工作,如果没有服务器则失败,然后循环重复,但是,第二次 connect() 永远阻塞(或至少比我想要的要长得多)。最初,我的循环只是围绕 connect() if 块(下面的代码),这也导致了同样的问题。之后,我将整个套接字设置(上面的代码)包含在循环中,但这也没有帮助。我还尝试在连接失败后关闭套接字,但这也无济于事。
循环初始值:
// other stuff from above here
for(int i = 0; i < i_TRIES; i++)
{
if(connect(i_socket, (struct sockaddr *)&server_address, sizeof(server_address)) < 0)
{
if(i < i_TRIES - 2)
{
cout << "[Client]: Connection to server failed. Trying again in " << t_timeout << " ms." << endl;
sleep(t_timeout);
}
else
{
cout << "[Client]: Could not connect to server, exiting." << endl;
exit(EXIT_FAILURE);
}
}
else
{
cout << "[Client]: Successfully connected to server." << endl;
break;
}
}
// do stuff with socket
我可以在一定时间后强制 connect() 到 return 吗?或者有没有办法让 connect() 函数自己尝试多次?或者在我重试之前我需要对套接字做些什么来重置所有东西吗?我希望这不是一个愚蠢的问题,我找不到任何关于如何多次连接的信息。
提前致谢!
将socket设置为non-blocking模式,使用select()
实现超时。 Select 用于套接字上的可写性。请注意,您可以通过这种方式减少平台连接超时,但不能增加它。
sleep()
毫无意义,简直就是浪费时间。
Can I force
connect()
to return after a certain amount of time has passed?
没有。您必须将套接字置于 non-blocking 模式,然后在等待套接字连接时使用 select()
或 (e)poll()
提供超时逻辑。如果连接失败,或者连接时间太长,请关闭套接字,创建一个新套接字,然后重试。
Or is there a way to get the
connect()
function to try multiple times on it's own?
没有。每次调用只能执行 1 次连接尝试。
Or is there something I need to do to the socket to reset everything before I can try again?
无法保证您甚至可以在同一个套接字上多次调用 connect()
。在某些平台上,您必须在再次调用 connect()
之前销毁套接字并创建一个新套接字。您应该养成对所有平台都这样做的习惯。