Skip to content

Instantly share code, notes, and snippets.

@sunmeat
Last active April 12, 2024 18:17
Show Gist options
  • Star 23 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • 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")
#pragma warning(disable:4996)
#define SERVER "127.0.0.1" // or "localhost" - ip address of UDP server
#define BUFLEN 512 // max length of answer
#define PORT 8888 // the port on which to listen for incoming data
class UDPClient {
public:
UDPClient() {
// initialise winsock
cout << "Initialising Winsock...\n";
if (WSAStartup(MAKEWORD(2, 2), &ws) != 0) {
cout << "Failed. Error Code: " << WSAGetLastError() << "\n";
exit(EXIT_FAILURE);
}
cout << "Initialised.\n";
// create socket
if ((client_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == SOCKET_ERROR) {
cout << "socket() failed with error code: " << WSAGetLastError() << "\n";
exit(EXIT_FAILURE);
}
// setup address structure
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() {
closesocket(client_socket);
WSACleanup();
}
void start() {
while (true) {
char message[BUFLEN];
cout << "Enter message: ";
cin.getline(message, BUFLEN);
// send the message
if (sendto(client_socket, message, strlen(message), 0, (sockaddr*)&server, sizeof(sockaddr_in)) == SOCKET_ERROR) {
cout << "sendto() failed with error code: " << WSAGetLastError() << "\n";
exit(EXIT_FAILURE);
}
// receive a reply and print it
// clear the answer by filling null, it might have previously received data
char answer[BUFLEN] = {};
// try to receive some data, this is a blocking call
int slen = sizeof(sockaddr_in);
int answer_length;
if ((answer_length = recvfrom(client_socket, answer, BUFLEN, 0, (sockaddr*)&server, &slen)) == SOCKET_ERROR) {
cout << "recvfrom() failed with error code: " << WSAGetLastError() << "\n";
exit(EXIT_FAILURE);
}
cout << "Server's response: " << answer << "\n";
}
}
private:
WSADATA ws;
SOCKET client_socket;
sockaddr_in server;
};
int main() {
system("title UDP Client");
MoveWindow(GetConsoleWindow(), 50, 50, 500, 500, true);
UDPClient udpClient;
udpClient.start();
}
==========================================================================================================================
SERVER SIDE:
#include <iostream>
#include <winsock2.h>
using namespace std;
#pragma comment(lib,"ws2_32.lib") // Winsock Library
#pragma warning(disable:4996)
#define BUFLEN 512
#define PORT 8888
class UDPServer {
public:
UDPServer() {
// initialise winsock
cout << "Initialising Winsock...\n";
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) {
cout << "Failed. Error Code: " << WSAGetLastError() << "\n";
exit(0);
}
cout << "Initialised.\n";
// create a socket
if ((server_socket = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET) {
cout << "Could not create socket: " << WSAGetLastError() << "\n";
exit(EXIT_FAILURE);
}
cout << "Socket created.\n";
// prepare the sockaddr_in structure
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(PORT);
// bind
if (bind(server_socket, (sockaddr*)&server, sizeof(server)) == SOCKET_ERROR) {
cout << "Bind failed with error code: " << WSAGetLastError() << "\n";
exit(EXIT_FAILURE);
}
cout << "Bind done.\n";
}
~UDPServer() {
closesocket(server_socket);
WSACleanup();
}
void start() {
while (!exitRequested) {
cout << "Waiting for data...\n";
char message[BUFLEN] = {};
// try to receive some data, this is a blocking call
int message_len;
int slen = sizeof(sockaddr_in);
if ((message_len = recvfrom(server_socket, message, BUFLEN, 0, (sockaddr*)&client, &slen)) == SOCKET_ERROR) {
cout << "recvfrom() failed with error code: " << WSAGetLastError() << "\n";
exit(0);
}
// print details of the client/peer and the data received
cout << "Received packet from " << inet_ntoa(client.sin_addr) << " " << ntohs(client.sin_port) << "\n";
cout << "Data: " << message << "\n";
cout << "Enter response (exit to stop server process): ";
cin.getline(message, BUFLEN);
// reply to the client with the same data
if (sendto(server_socket, message, strlen(message), 0, (sockaddr*)&client, sizeof(sockaddr_in)) == SOCKET_ERROR) {
cout << "sendto() failed with error code: " << WSAGetLastError() << "\n";
exit(EXIT_FAILURE);
}
if (strcmp(message, "exit") == 0) {
cout << "Exiting server...\n";
exitRequested = true;
break;
}
}
}
private:
WSADATA wsa{};
SOCKET server_socket = 0;
sockaddr_in server{}, client{};
bool exitRequested = false;
};
int main() {
system("title UDP Server");
MoveWindow(GetConsoleWindow(), 650, 50, 500, 500, true);
UDPServer udpServer;
ShellExecuteA(GetConsoleWindow(), "open", "\"C:/Users/Alex/Desktop/ClientServer/x64/Debug/Client.exe\"", 0, 0, SW_NORMAL);
udpServer.start();
}
int main() {
system("title UDP Server");
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