Created
March 15, 2025 15:33
-
-
Save sunmeat/80e47815711fe6340fee8202d8e4d0f4 to your computer and use it in GitHub Desktop.
TCP + threads: CLIENT SIDE
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
SERVER SIDE: https://gist.github.com/sunmeat/0092381a01c7a799464d0b94d75cebc4