Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 尝试在TCP中多次连接()_C++_Linux_Sockets_Network Programming_Tcp Ip - Fatal编程技术网

C++ 尝试在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++

我正在编写一个客户机/服务器应用程序,其中客户机和服务器应通过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
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