繁体   English   中英

如何使用 select() 添加服务器连接超时?

[英]How to add server connection timeout using select()?

我想添加超时以连接到服务器,因为如果服务器关闭,我的应用程序将停止工作并开始等待服务器回复 1 分钟。 我想在固定时间后停止尝试连接到服务器。 他们说我应该使用 select(),但我不明白如何将它集成到下面的代码中:

    int client;
    bool isExit = false;
    int fileSize = 0;
    int size = 0;
    int bufsize = 1024;
    char buffer[bufsize];

    string fileEnd = "<EOF>";

    string modelFolder = currentModelFolder;

    replace(modelFolder.begin(),
            modelFolder.end(),
            ';',
            '/');

    string requestStructure = modelFolder + "/" + currentFileName + "/" + fileEnd + "|" + '\0';

    char *bytes = new char[requestStructure.length()];
    memcpy(bytes, requestStructure.data(), requestStructure.length());

    sockaddr_in server_addr;

    client = socket(AF_INET, SOCK_STREAM, 0);

    if (client < 0)
    {
        cout << "Error establishing socket..." << endl;
        exit(1);
    }
    else
        cout << "Socket client has been created..." << endl;

    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(serverPort);
    inet_aton(serverIp.c_str(), &server_addr.sin_addr);

    if (connect(client, (struct sockaddr *)&server_addr, sizeof(server_addr)) == 0)
    {
        cout << "=> Connection to the server port number: " << serverPort << endl;
    }

    // отправка запроса на сервер (сервер, данные, размер пакета)
    send(client, bytes, bufsize, 0);
    cout << "=> Awaiting confirmation from the server..." << endl;

    // получение данных с сервера (сервер, массив байтов, размер пакета)
    recv(client, buffer, bufsize, 0);
    cout << "Buffer = " << buffer << endl;

    int bufferStringSize = sizeof(buffer);
    string bufferSize = convertToString(buffer, bufferStringSize);

    stringstream stringToIntStream;
    stringToIntStream << bufferSize;
    stringToIntStream >> fileSize;

    ostringstream stepFilePathStructure;
    stepFilePathStructure << saveFolderPath << currentFileName << "";

    string stepFilePath = stepFilePathStructure.str();

    remove(stepFilePath.c_str());

    ofstream stepFile;
    stepFile.open(stepFilePath);

    while (size < fileSize)
    {
        int received = recv(client, buffer, bufsize, 0);

        stepFile.write(buffer, received);

        size += received;
    }

    close(client);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM