Skip to content

Instantly share code, notes, and snippets.

@sunmeat
Created March 15, 2025 15:33
Show Gist options
  • Save sunmeat/80e47815711fe6340fee8202d8e4d0f4 to your computer and use it in GitHub Desktop.
Save sunmeat/80e47815711fe6340fee8202d8e4d0f4 to your computer and use it in GitHub Desktop.
TCP + threads: CLIENT SIDE
#define WIN32_LEAN_AND_MEAN
#include <iostream>
#include <windows.h>
#include <ws2tcpip.h>
using namespace std;
#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib")
#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT "27015"
#define PAUSE 1
// попытка подключиться к адресу, пока не получится
SOCKET ConnectSocket = INVALID_SOCKET;
DWORD WINAPI Sender(void* param)
{
while (true)
{
// отправить начальный буфер
char* message = new char[200];
cout << "Пожалуйста, введите сообщение для сервера: ";
cin.getline(message, 199);
int iResult = send(ConnectSocket, message, (int)strlen(message), 0);
if (iResult == SOCKET_ERROR) {
cout << "ошибка отправки: " << WSAGetLastError() << "\n";
closesocket(ConnectSocket);
WSACleanup();
return 15;
}
else {
cout << "данные успешно отправлены на сервер: " << message << "\n";
delete[] message;
Sleep(PAUSE);
}
}
return 0;
}
DWORD WINAPI Receiver(void* param)
{
while (true)
{
// принимать данные, пока собеседник не закроет соединение
char answer[DEFAULT_BUFLEN];
int iResult = recv(ConnectSocket, answer, DEFAULT_BUFLEN, 0);
answer[iResult] = '\0';
if (iResult > 0) {
cout << "\nпроцесс сервера отправил сообщение: " << answer << "\n";
}
else if (iResult == 0)
cout << "соединение с сервером закрыто.\n";
else
cout << "ошибка приёма: " << WSAGetLastError() << "\n";
}
return 0;
}
int main()
{
setlocale(0, "");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
system("title CLIENT SIDE");
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// инициализация Winsock
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0) {
cout << "не удалось инициализировать Winsock: " << iResult << "\n";
return 11;
}
else {
Sleep(PAUSE);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
addrinfo hints{};
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
// получение адреса и порта сервера
const char* ip = "localhost"; // по умолчанию, оба приложения, и клиент, и сервер, работают на одной машине
addrinfo* result = NULL;
iResult = getaddrinfo(ip, DEFAULT_PORT, &hints, &result);
if (iResult != 0) {
cout << "getaddrinfo не удалось: " << iResult << "\n";
WSACleanup();
return 12;
}
else {
Sleep(PAUSE);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
for (addrinfo* ptr = result; ptr != NULL; ptr = ptr->ai_next) {
// создание SOCKET для подключения к серверу
ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);
if (ConnectSocket == INVALID_SOCKET) {
cout << "не удалось создать socket: " << WSAGetLastError() << "\n";
WSACleanup();
return 13;
}
// подключение к серверу
iResult = connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
if (iResult == SOCKET_ERROR) {
closesocket(ConnectSocket);
ConnectSocket = INVALID_SOCKET;
continue;
}
Sleep(PAUSE);
break;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
freeaddrinfo(result);
if (ConnectSocket == INVALID_SOCKET) {
cout << "невозможно подключиться к серверу!\n";
WSACleanup();
return 14;
}
else {
Sleep(PAUSE);
}
CreateThread(0, 0, Sender, 0, 0, 0);
CreateThread(0, 0, Receiver, 0, 0, 0);
Sleep(INFINITE);
}
@sunmeat
Copy link
Author

sunmeat commented Mar 15, 2025

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment