Last active
March 18, 2025 12:03
-
-
Save sunmeat/02b60c8a3eaef3b8a0fb3c249d8686fd to your computer and use it in GitHub Desktop.
client server UDP C++ example
This file contains 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
CLIENT SIDE: | |
#include <iostream> | |
#include <winsock2.h> | |
using namespace std; | |
#pragma comment(lib,"ws2_32.lib") // подключение библиотеки winsock | |
#pragma warning(disable:4996) | |
#define SERVER "127.0.0.1" // ip-адрес сервера (локальный хост) | |
#define BUFLEN 512 // максимальная длина ответа | |
#define PORT 8888 // порт для приема данных | |
class UDPClient { | |
public: | |
UDPClient() { | |
// инициализация winsock | |
cout << "инициализация winsock...\n"; | |
if (WSAStartup(MAKEWORD(2, 2), &ws) != 0) { | |
cout << "ошибка инициализации. код ошибки: " << WSAGetLastError() << "\n"; | |
exit(EXIT_FAILURE); | |
} | |
cout << "инициализация завершена.\n"; | |
// создание сокета | |
if ((client_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == SOCKET_ERROR) { | |
cout << "ошибка создания сокета. код ошибки: " << WSAGetLastError() << "\n"; | |
exit(EXIT_FAILURE); | |
} | |
// настройка структуры адреса сервера | |
memset((char*)&server, 0, sizeof(server)); | |
server.sin_family = AF_INET; | |
server.sin_port = htons(PORT); | |
server.sin_addr.S_un.S_addr = inet_addr(SERVER); | |
} | |
~UDPClient() { | |
// закрытие сокета и очистка winsock | |
closesocket(client_socket); | |
WSACleanup(); | |
} | |
void start() { | |
while (true) { | |
char message[BUFLEN]; | |
cout << "введите сообщение: "; | |
cin.getline(message, BUFLEN); | |
// отправка сообщения серверу | |
if (sendto(client_socket, message, strlen(message), 0, (sockaddr*)&server, sizeof(sockaddr_in)) == SOCKET_ERROR) { | |
cout << "ошибка отправки. код ошибки: " << WSAGetLastError() << "\n"; | |
exit(EXIT_FAILURE); | |
} | |
cout << "ожидайте ответ от сервера...\n"; | |
// получение ответа от сервера | |
char answer[BUFLEN] = {}; | |
int slen = sizeof(sockaddr_in); | |
int answer_length; | |
if ((answer_length = recvfrom(client_socket, answer, BUFLEN, 0, (sockaddr*)&server, &slen)) == SOCKET_ERROR) { | |
cout << "ошибка получения данных. код ошибки: " << WSAGetLastError() << "\n"; | |
exit(EXIT_FAILURE); | |
} | |
cout << "ответ сервера: " << answer << "\n"; | |
} | |
} | |
private: | |
WSADATA ws; // данные winsock | |
SOCKET client_socket; // сокет клиента | |
sockaddr_in server; // адрес сервера | |
}; | |
int main() { | |
system("title UDP CLIENT SIDE"); | |
setlocale(0, ""); | |
UDPClient udpClient; | |
udpClient.start(); | |
} | |
========================================================================================================================== | |
SERVER SIDE: | |
#include <iostream> | |
#include <winsock2.h> | |
using namespace std; | |
#pragma comment(lib,"ws2_32.lib") // библиотека winsock | |
#pragma warning(disable:4996) | |
#define BUFLEN 512 // размер буфера | |
#define PORT 8888 // порт сервера | |
class UDPServer { | |
public: | |
UDPServer() { | |
// инициализация winsock | |
cout << "инициализация winsock...\n"; | |
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) { | |
cout << "ошибка инициализации: " << WSAGetLastError() << "\n"; | |
exit(0); | |
} | |
cout << "инициализация завершена.\n"; | |
// создание сокета | |
if ((server_socket = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET) { | |
cout << "не удалось создать сокет: " << WSAGetLastError() << "\n"; | |
exit(EXIT_FAILURE); | |
} | |
cout << "сокет создан.\n"; | |
// настройка структуры sockaddr_in | |
server.sin_family = AF_INET; | |
server.sin_addr.s_addr = INADDR_ANY; | |
server.sin_port = htons(PORT); | |
// привязка сокета | |
if (bind(server_socket, (sockaddr*)&server, sizeof(server)) == SOCKET_ERROR) { | |
cout << "ошибка привязки: " << WSAGetLastError() << "\n"; | |
exit(EXIT_FAILURE); | |
} | |
cout << "привязка выполнена.\n"; | |
} | |
~UDPServer() { | |
closesocket(server_socket); | |
WSACleanup(); | |
} | |
void start() { | |
while (!exitRequested) { | |
cout << "ожидайте данные от клиента...\n"; | |
char message[BUFLEN] = {}; | |
// получение данных (блокирующий вызов) | |
int message_len; | |
int slen = sizeof(sockaddr_in); | |
if ((message_len = recvfrom(server_socket, message, BUFLEN, 0, (sockaddr*)&client, &slen)) == SOCKET_ERROR) { | |
cout << "ошибка recvfrom(): " << WSAGetLastError() << "\n"; | |
exit(0); | |
} | |
// вывод информации о клиенте и полученных данных | |
cout << "получен пакет от " << inet_ntoa(client.sin_addr) << " " << ntohs(client.sin_port) << "\n"; | |
cout << "данные: " << message << "\n"; | |
cout << "введите ответ (exit для выхода): "; | |
cin.getline(message, BUFLEN); | |
// отправка ответа клиенту | |
if (sendto(server_socket, message, strlen(message), 0, (sockaddr*)&client, sizeof(sockaddr_in)) == SOCKET_ERROR) { | |
cout << "ошибка sendto(): " << WSAGetLastError() << "\n"; | |
exit(EXIT_FAILURE); | |
} | |
if (strcmp(message, "exit") == 0) { | |
cout << "завершение работы сервера...\n"; | |
exitRequested = true; | |
break; | |
} | |
} | |
} | |
private: | |
WSADATA wsa{}; | |
SOCKET server_socket = 0; | |
sockaddr_in server{}, client{}; | |
bool exitRequested = false; | |
}; | |
int main() { | |
system("title UDP SERVER SIDE"); | |
setlocale(0, ""); | |
UDPServer udpServer; | |
udpServer.start(); | |
} |
It seems line 157-158 is unreachable, right?
Hi, @wirekang! I made a check so that the server can stop its work now :)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
It seems line 157-158 is unreachable, right?