尝试在TCP中多次连接()
Trying to connect() multiple times in TCP
我正在编写客户端/服务器应用程序,客户端和服务器应通过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((connect(或至少适用于很多(比我想要的时间更长(。最初,如果块(下面的代码(,我的循环就在connect((周围,这也引起了同样的问题。之后,我将整个套接字设置(上面的代码(包括在循环中,但这也无济于事。连接失败后,我还尝试关闭插座,但这也无济于事。
循环的初始:
// 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((函数自行尝试多次?还是我需要对套接字进行操作以重置所有内容,然后才能重试?我希望这不是一个愚蠢的问题,我找不到有关如何多次连接的任何信息。
预先感谢!
我可以强迫
connect()
经过一定的时间后返回吗?
否。您必须将套接字放入非阻滞模式,然后使用select()
或(e)poll()
在等待套接字连接时提供超时逻辑。如果连接失败或花费太长连接,请关闭套接字,创建一个新的连接,然后重试。
还是有一种方法可以使
connect()
函数自行尝试多次?
否。它可以通过呼叫只执行1个连接尝试。
,或者我需要对套接字需要做些事情才能重置所有内容,然后才能再次尝试?
无法保证您甚至可以在同一套接字上多次调用connect()
。在某些平台上,您必须在再次调用connect()
之前销毁套接字并创建一个新的套接字。您应该养成所有平台的习惯。
将套接字放入非阻滞模式,并使用select()
实现超时。选择插座上的写入。请注意,您可以通过这种方式减少平台连接超时,但不会增加它。
sleep()
毫无意义,实际上是浪费时间。
- 计算出有多少客户端可以连接到我正在使用的一些tcp服务器代码
- 通过单独的 tcp 流建立 http 连接
- 读取 TCP 标头并使用RAW_SOCKET管理 TCP 连接
- C++ TCP 套接字通信 - 连接按预期工作,几秒钟后失败,没有收到新数据,read() 和 recv() 块
- 如何在没有侦听器的情况下创建 TCP 连接?
- 接受超时的 TCP 连接
- 如何使用 TCP 连接发送大块数据
- 如何在 c++ 中确定 tcp 客户端是否连接
- 尝试连接到 TCP 套接字 (Linux) 时连接被拒绝
- 仅通过建立一次TCP连接将Recv从客户端发送到服务器套接字
- 如何正确解析 Java+C++ TCP 连接中的 JSON 对象?
- 从多个 tcp 连接读取数据
- 同一提升 TCP 套接字对象上的多个连接
- TCP/IP 客户端是否可以连接到无法访问的 IP
- TCP 连接中的超时,没有数据交换
- 在服务器关闭的TCP连接上发送数据时的行为不一致
- 在写入过程中立即使用boost::asio检测关闭的TCP连接
- 尝试在TCP中多次连接()
- 在使用 Poll() 的 TCP 服务器 - 客户端连接中,我是否需要手动设置事件?我从来没有到达 POLLOUT 来写
- 使用SecureStreamSocket与poco连接TCP服务器时,如何发送证书