#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;
}