Загрузка данных


#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iostream>
#include <string>

#pragma comment(lib, "ws2_32.lib")
#pragma warning(disable: 4996)

using namespace std;

const int PORT = 1111;
const char* SERVER_IP = "127.0.0.1";

bool InitWinsock()
{
    WSADATA wsaData;
    WORD version = MAKEWORD(2, 2);

    if (WSAStartup(version, &wsaData) != 0)
    {
        cerr << "WSAStartup failed.\n";
        return false;
    }

    return true;
}

bool SendText(SOCKET s, const string& text)
{
    int result = send(s, text.c_str(), (int)text.size() + 1, 0);
    return result > 0;
}

bool RecvText(SOCKET s, string& outText)
{
    char buffer[256] = {};
    int result = recv(s, buffer, sizeof(buffer), 0);

    if (result <= 0)
        return false;

    outText = buffer;
    return true;
}

int main(int argc, char* argv[])
{
    setlocale(LC_ALL, "Russian");

    if (!InitWinsock())
        return 1;

    int pilgrimId = 0;
    int patienceMs = 0;

    if (argc >= 3)
    {
        pilgrimId = atoi(argv[1]);
        patienceMs = atoi(argv[2]);
    }
    else
    {
        cout << "Введите id паломника: ";
        cin >> pilgrimId;

        cout << "Введите терпение в мс: ";
        cin >> patienceMs;
    }

    SOCKET connection = socket(AF_INET, SOCK_STREAM, 0);
    if (connection == INVALID_SOCKET)
    {
        cerr << "Ошибка создания сокета.\n";
        WSACleanup();
        return 1;
    }

    SOCKADDR_IN addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(PORT);
    addr.sin_addr.s_addr = inet_addr(SERVER_IP);

    if (connect(connection, (SOCKADDR*)&addr, sizeof(addr)) != 0)
    {
        cerr << "Не удалось подключиться к флоту.\n";
        closesocket(connection);
        WSACleanup();
        return 1;
    }

    cout << "Паломник #" << pilgrimId
         << " подключился к флоту. Терпение: "
         << patienceMs << " мс.\n";

    string request = to_string(pilgrimId) + " " + to_string(patienceMs);

    if (!SendText(connection, request))
    {
        cerr << "Не удалось отправить данные серверу.\n";
        closesocket(connection);
        WSACleanup();
        return 1;
    }

    string reply;
    if (!RecvText(connection, reply))
    {
        cerr << "Не удалось получить ответ от сервера.\n";
        closesocket(connection);
        WSACleanup();
        return 1;
    }

    if (reply == "FOOT")
    {
        cout << "Паломник #" << pilgrimId
             << " не дождался корабля и пошел пешком.\n";
    }
    else
    {
        int shipId = 0;
        int placeNumber = 0;

        if (sscanf(reply.c_str(), "SHIP %d %d", &shipId, &placeNumber) == 2)
        {
            cout << "Паломник #" << pilgrimId
                 << " сел на корабль #" << shipId
                 << ", место " << placeNumber << ".\n";
        }
        else
        {
            cout << "Неизвестный ответ сервера: " << reply << endl;
        }
    }

    closesocket(connection);
    WSACleanup();
    return 0;
}