- Порядок выполнения (+ варианты) (.pdf)
- Предоставлен готовый клиент-серверный проект с hello world.
- Написано для windows
- Вы выбираете вариант и пишите логику приложения
- Сначала запускается сервер, а потом клиент
Я написал легкую обработку клиентского запроса, аля коллбэка, но это не точно
#include <iostream>
#include <string>
#include "Server.h"
std::string dirFinder(std::string search)
{
std::string result = "hello, " + search;
return result;
}
int main()
{
setlocale(LC_ALL, "rus");
startServer(dirFinder, "127.0.0.1", "27015");
return 0;
}
Здесь находится стартовая точка программы, все манипуляции с клиентским запросом и с ответом происходят в этом файле.
Взгяните внимательно на startServer(dirFinder, "127.0.0.1", "27015");
это просто функция-loop, которая запускает бесконечную
прослушку соединения.
В параметрах этой функции вы заметили dirFinder
- просто название функции (функция может иметь любое название), которая находится выше;
Сделано это для того, чтобы при запросе от клиента, сервер вызвал эту функцию с параметром типа string
(параметр может иметь любое название,
я назвал "search" для себя), далее внутри функции (в моем случае) dirFinder
можнно менять запрос, производить какие-то действия и пр по лабе, а после
вернуть из функции результат return
, который отправится клиенту.
Краткое пояснения примера:
- клиент отправляет текст
- Сервер получает этот текст в функции (в моем случае)
dirFinder
и возвращает ответ клиенту - клиент получает ответ
Я написал легкую обработку серверного запроса, аля requests в питоне
По сути мы каждый раз открываем и закрываем соединение с сервером, хотя у меня
был вариает всегда держать соединение открытым, но я отказался от этого
#include <iostream>
#include "Client.h"
int main()
{
setlocale(LC_ALL, "rus");
const char* addresses = "127.0.0.1";
const char* port = "27015";
std::string result = request(Client(addresses, port), "Никита");
std::cout << "От сервера: " << result << std::endl;
std::string result2 = request(Client(addresses, port), "Полина");
std::cout << "От сервера: " << result2 << std::endl;
return 0;
}
Весь код можно писать поямо в main()
Функция request(Client(addresses, port), "Никита")
принимает первым аргументом подключенный SOCKET
, в нашем случае Client(addresses, port)
вторым аргументом строку типа string
, в нашем случае "Никита"
; Сама функция передает серверу строку (в нашем случае 'Никита') и возвращает ответ сервера в формате string
.
Если у вас возникает ошибка у клиента, связанная с recvbuf
(ф-ция getResp
в файле Client.cpp
), то возможно вы передали слишком много информации за раз и Ваш буфер забит. Советую что-то сделать: переписать сервер на более универсальны вид (разделение информации на чанки) или просто увеличить значение буфера до 60000(к примеру)