C++ 尝试在TCP中多次连接()
我正在编写一个客户机/服务器应用程序,其中客户机和服务器应通过TCP套接字相互发送数据。客户端应该连接到服务器,如果连接失败,它应该等待几秒钟,然后再次尝试连接到服务器(最多尝试一定次数) 这是我目前拥有的代码:C++ 尝试在TCP中多次连接(),c++,linux,sockets,network-programming,tcp-ip,C++,Linux,Sockets,Network Programming,Tcp Ip,我正在编写一个客户机/服务器应用程序,其中客户机和服务器应通过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++
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
const int i_trys=5;
超时时间=3000;
int i_端口=5678;
内部i_插座;
字符串s_IP=“127.0.0.1”;
for(int i=0;icout将套接字置于非阻塞模式,并使用select()
实现超时。选择套接字上的可写性。请注意,您可以通过这种方式减少平台连接超时,但不能增加超时
sleep()
毫无意义,简直是浪费时间。将套接字置于非阻塞模式,并使用select()
实现超时。选择套接字的可写性。请注意,您可以通过这种方式减少平台连接超时,但不能增加超时
sleep()
毫无意义,简直是浪费时间
我可以强制connect()
在经过一定时间后返回吗
不可以。您必须将套接字置于非阻塞模式,然后在等待套接字连接时使用select()
或(e)poll()
提供超时逻辑。如果连接失败或连接时间过长,请关闭套接字,创建一个新的套接字,然后重试
或者有没有办法让connect()
函数自己尝试多次
不可以。每次呼叫只能执行一次连接尝试
或者,在我重试之前,是否需要对套接字执行某些操作以重置所有内容
无法保证您甚至可以在同一个套接字上多次调用connect()
。在某些平台上,您必须销毁该套接字并创建一个新套接字,然后才能再次调用connect()
。您应该养成在所有平台上都这样做的习惯
我可以强制connect()
在经过一定时间后返回吗
不可以。您必须将套接字置于非阻塞模式,然后在等待套接字连接时使用select()
或(e)poll()
提供超时逻辑。如果连接失败或连接时间过长,请关闭套接字,创建一个新的套接字,然后重试
或者有没有办法让connect()
函数自己尝试多次
不可以。每次呼叫只能执行一次连接尝试
或者,在我重试之前,是否需要对套接字执行某些操作以重置所有内容
无法保证您甚至可以在同一个套接字上多次调用connect()
。在某些平台上,您必须销毁该套接字并创建一个新套接字,然后才能再次调用connect()
。您应该养成在所有平台上都这样做的习惯“在某些平台上,在再次调用connect()之前必须先销毁套接字并创建新套接字”我可以创建一个临时套接字,然后只复制int变量将套接字放入我的类变量中吗?”在某些平台上,在再次调用connect()之前,必须先销毁套接字并创建一个新套接字“我可以创建一个临时套接字,然后将int变量复制到我的类变量中吗?
// 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