Как передать переменную с клиента на сервер по сокетам?

Вот мой сокет-сервер

#define WIN32_LEAN_AND_MEAN //определение макроса
#include <iostream>
#include <windows.h>
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <string>
using namespace std;

int main()
{
    cout << "It's a Server's console" << endl;
    //настройка среды и сокетов
    WSADATA wsaData;
    ADDRINFO hints;
    ADDRINFO* addrResult = NULL;
    SOCKET ClientSocket = INVALID_SOCKET; //инициализация нерабочего сокета
    SOCKET ListenSocket = INVALID_SOCKET; //инициализация слушающего сокета
    
    const char* sendBuffer = "Hello from Server! Send me temperature in Celsies degrees and i'll tell you, is it warm or cold."; //создание буффера для отправки
    char recvBuffer[512]; //буффер для приема

    int result;

    result = WSAStartup(MAKEWORD(2, 2), &wsaData); //запуск 
    if (result != 0)
    {
        cout << "WSAStartup failed, result = " << result << endl;
        return 1; //вернуть ошибку
    }

    ZeroMemory(&hints, sizeof(hints)); //обнуление всех данных хинтс чтоб присвоить свои
    hints.ai_family = AF_INET; //семейство сокетов по ip.v4
    hints.ai_socktype = SOCK_STREAM; //потоковая работа сокета
    hints.ai_protocol = IPPROTO_TCP; //выбор протокола тспайпи
    hints.ai_flags = AI_PASSIVE;

    result = getaddrinfo(NULL, "666", &hints, &addrResult); //имя сервера - имя порта - два указателя
    if (result != 0)
    {
        cout << "getaddrinfo failed with error: " << result << endl;
        WSACleanup(); //очистка вса данных
        return 1; //вернуть ошибку
    }

    ListenSocket = socket(addrResult->ai_family, addrResult->ai_socktype, addrResult->ai_protocol); //присвоение сокету семейства, типа и протокола
    if (ListenSocket == INVALID_SOCKET) //сравнение настроенного сокета с изначальным нерабочим
    {
        cout << "Socket creation failed" << endl;
        freeaddrinfo(addrResult);
        WSACleanup();
        return 1;
    }

    result = bind(ListenSocket, addrResult->ai_addr, (int)addrResult->ai_addrlen); //запрос на соединение(имя сокета, адрес сокета, размер
    if (result == SOCKET_ERROR) //проверка на ошибку
    {
        cout << "Binding socket failed" << endl;
        closesocket(ListenSocket); //если ошибка есть, то закрываем наш сокет
        ListenSocket = INVALID_SOCKET; //возвращаем его обратно в нерабочее состояние
        freeaddrinfo(addrResult);
        WSACleanup();
        return 1;
    }
    result = listen(ListenSocket, SOMAXCONN); //Выбор сокета и !!!Выбор кол-ва подключенных!!!
    if (result == SOCKET_ERROR)
    {
        cout << "Listening socket failed" << endl;
        closesocket(ListenSocket);
        freeaddrinfo(addrResult);
        WSACleanup();
        return 1;
    }

    ClientSocket = accept(ListenSocket, NULL, NULL);
    if (ClientSocket == INVALID_SOCKET)
    { 
        cout << "Accepting socket failed" << endl;
        closesocket(ListenSocket);
        freeaddrinfo(addrResult);
        WSACleanup();
        return 1;
    }

    closesocket(ListenSocket);

    do
    {
        ZeroMemory(recvBuffer, 512); //обнуление буффера приема
        result = recv(ClientSocket, recvBuffer, 512, 0); //прием с какого сокета, куда принимать, какйо размер буффера. 0 если сокет закрыт с другой стороны
        if (result > 0)
        {
            cout << recvBuffer << endl;

            result = send(ClientSocket, sendBuffer, (int)strlen(sendBuffer), 0);
            if (result == SOCKET_ERROR)
            {
                cout << "Failed to send data back" << endl;
                closesocket(ClientSocket);
                freeaddrinfo(addrResult);
                WSACleanup();
                return 1;
            }
        }
        else if (result == 0)
            cout << "Connection closing..." << endl;
        else
        {
            cout << "recv failed with error" << endl;
            closesocket(ClientSocket);
            freeaddrinfo(addrResult);
            WSACleanup();
            return 1;
        }
    } while (result > 0);

    result = shutdown(ClientSocket, SD_SEND);
    if (result == SOCKET_ERROR)
    {
        cout << "Shutdown client socker failed" << endl;
        closesocket(ClientSocket);
        freeaddrinfo(addrResult);
        WSACleanup();
        return 1;
    }

    closesocket(ClientSocket);
    freeaddrinfo(addrResult);
    WSACleanup();
    return 0;

}

А вот мой сокет-клиент.

#define WIN32_LEAN_AND_MEAN //определение макроса
#include <iostream>
#include <windows.h>
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <string>
using namespace std;

int main()
{
    cout << "It's a Client's console" << endl;
    //настройка среды и сокетов
    WSADATA wsaData;
    ADDRINFO hints;
    ADDRINFO* addrResult = NULL;
    SOCKET ConnectSocket = INVALID_SOCKET; //инициализация нерабочего сокета

    const char* sendBuffer = "Hello from Client!"; //создание буффера для отправки
    char recvBuffer[512]; //буффер для приема

    int result;

    result = WSAStartup(MAKEWORD(2, 2), &wsaData); //запуск 
    if (result != 0)
    {
        cout << "WSAStartup failed, result = " << result << endl;
        return 1; //вернуть ошибку
    }

    ZeroMemory(&hints, sizeof(hints)); //обнуление всех данных хинтс чтоб присвоить свои
    hints.ai_family = AF_INET; //семейство сокетов по ip.v4
    hints.ai_socktype = SOCK_STREAM; //потоковая работа сокета
    hints.ai_protocol = IPPROTO_TCP; //выбор протокола тспайпи

    result = getaddrinfo("localhost", "666", &hints, &addrResult); //имя сервера - имя порта - два указателя
    if (result != 0)
    {
        cout << "getaddrinfo failed with error: " << result << endl;
        WSACleanup(); //очистка вса данных
        return 1; //вернуть ошибку
    }

    ConnectSocket = socket(addrResult->ai_family, addrResult->ai_socktype, addrResult->ai_protocol); //присвоение сокету семейства, типа и протокола
    if (ConnectSocket == INVALID_SOCKET) //сравнение настроенного сокета с изначальным нерабочим
    {
        cout << "Socket creation failed" << endl;
        freeaddrinfo(addrResult);
        WSACleanup();
        return 1;
    }

    result = connect(ConnectSocket, addrResult->ai_addr, (int)addrResult->ai_addrlen); //запрос на соединение(имя сокета, адрес сокета, размер
    if (result == SOCKET_ERROR) //проверка на ошибку
    {
        cout << "Unable connect to server" << endl;
        closesocket(ConnectSocket); //если ошибка есть, то закрываем наш сокет
        ConnectSocket = INVALID_SOCKET; //возвращаем его обратно в нерабочее состояние
        freeaddrinfo(addrResult);
        WSACleanup();
        return 1;
    }
    //отправка сообщения на сервер
    result = send(ConnectSocket, sendBuffer, (int)strlen(sendBuffer), 0); //функция отправвки сообщения(имя сокета, выбор буфера, размер буфера)
    if (result == SOCKET_ERROR)
    {
        cout << "Sending is failed, error: " << result << endl;
        closesocket(ConnectSocket);
        freeaddrinfo(addrResult);
        WSACleanup();
        return 1;
    }

    //освобождаем сокет от отправки сообщений
    result = shutdown(ConnectSocket, SD_SEND); //какой сокет и как выключить
    if (result == SOCKET_ERROR)
    {
        cout << "Shutdown is failed, error: " << result << endl;
        closesocket(ConnectSocket);
        freeaddrinfo(addrResult);
        WSACleanup();
        return 1;
    }

    do
    {
        ZeroMemory(recvBuffer, 512); //обнуление буффера приема
        result = recv(ConnectSocket, recvBuffer, 512, 0); //прием с какого сокета, куда принимать, какой размер буффера. 0 если сокет закрыт с другой стороны
        if (result > 0)
        {
            cout << recvBuffer << endl;
        }
        else if (result == 0)
            cout << "Connection closed" << endl;
        else
            cout << "recv failed with error" << endl;
    } while (result > 0);

    closesocket(ConnectSocket);
    freeaddrinfo(addrResult);
    WSACleanup();
    return 0;

}

Мне нужно сделать так, чтоб клиент 10 раз вводил переменную temp а сервер ее считывал. Если переменная temp от -100 до 15, клиенту приходит сообщение "Put on your jacket". Если больше - "You can go out with a T-shirt". Звучит очень просто, но моя главная проблема в том, что я не имею малейшего понятия, как передать в буфер сокета int. Все сокетные команды требуют, чтоб буфер был const char. А как мне в const char запихнуть, например, 26 градусов? Я делал цикл while (i < 10) и в нем вводил temp, передавал ее значение сенд буфферу и пытался отправить. Компилятор говорит, что это не конст чар, ничего отправлять не буду. Что мне делать?


Ответы (0 шт):