Как передать переменную с клиента на сервер по сокетам?
Вот мой сокет-сервер
#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, передавал ее значение сенд буфферу и пытался отправить. Компилятор говорит, что это не конст чар, ничего отправлять не буду. Что мне делать?