Last active
September 19, 2025 08:50
-
-
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 КЛІЄНТСЬКА СТОРОНА"); | |
///////////////////////////////////////////////////////////////////////////////////////////////////////// | |
// ініціалізація 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 << "не вдалося створити сокет: " << 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