Skip to content

Instantly share code, notes, and snippets.

@sunmeat
Last active March 18, 2025 12:03
Show Gist options
  • Save sunmeat/02b60c8a3eaef3b8a0fb3c249d8686fd to your computer and use it in GitHub Desktop.
Save sunmeat/02b60c8a3eaef3b8a0fb3c249d8686fd to your computer and use it in GitHub Desktop.
client server UDP C++ example
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();
}
@wirekang
Copy link

wirekang commented Jan 7, 2024

It seems line 157-158 is unreachable, right?

@sunmeat
Copy link
Author

sunmeat commented Feb 4, 2024

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