尝试在TCP中多次连接()

Trying to connect() multiple times in TCP

本文关键字:连接 TCP      更新时间:2023-10-16

我正在编写客户端/服务器应用程序,客户端和服务器应通过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()毫无意义,实际上是浪费时间。