Overview
The User Datagram Protocol (UDP) is a connectionless transport protocol that provides low‑overhead, best‑effort delivery of datagrams. In Windows, UDP is accessed through the Winsock API or higher‑level .NET networking classes.
API Overview
Key Winsock functions for UDP include:
socket()
– creates a datagram socket withSOCK_DGRAM
.bind()
– assigns a local port.sendto()
– transmits a datagram to a remote address.recvfrom()
– receives a datagram and captures the sender's address.setsockopt()
– configures socket options such asSO_BROADCAST
orIP_TTL
.
Creating a UDP Socket
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
int init_udp_socket(SOCKET *sock) {
WSADATA wsa;
if (WSAStartup(MAKEWORD(2,2), &wsa) != 0) return -1;
*sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
return (*sock == INVALID_SOCKET) ? -1 : 0;
}
Sending & Receiving
// Send
struct sockaddr_in dest;
dest.sin_family = AF_INET;
dest.sin_port = htons(5000);
dest.sin_addr.s_addr = inet_addr("192.168.1.100");
sendto(sock, "Hello", 5, 0, (struct sockaddr*)&dest, sizeof(dest));
// Receive
char buf[512];
struct sockaddr_in src;
int srcLen = sizeof(src);
int bytes = recvfrom(sock, buf, sizeof(buf)-1, 0, (struct sockaddr*)&src, &srcLen);
if (bytes > 0) {
buf[bytes] = '\\0';
printf("Received: %s\\n", buf);
}
C# Example (System.Net.Sockets)
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
class UdpDemo {
static void Main() {
using UdpClient client = new UdpClient(0);
IPEndPoint remote = new IPEndPoint(IPAddress.Parse("192.168.1.100"), 5000);
byte[] data = Encoding.UTF8.GetBytes("Hello from C#");
client.Send(data, data.Length, remote);
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
byte[] recv = client.Receive(ref sender);
Console.WriteLine($"Received from {sender}: {Encoding.UTF8.GetString(recv)}");
}
}
C++ Example (Winsock)
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iostream>
#pragma comment(lib, "ws2_32.lib")
int main() {
WSADATA wsa;
WSAStartup(MAKEWORD(2,2), &wsa);
SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sock == INVALID_SOCKET) return 1;
sockaddr_in server{};
server.sin_family = AF_INET;
server.sin_port = htons(5000);
inet_pton(AF_INET, "192.168.1.100", &server.sin_addr);
const char* msg = "Hello from C++";
sendto(sock, msg, (int)strlen(msg), 0, (sockaddr*)&server, sizeof(server));
char buf[1024];
sockaddr_in src{};
int srcSize = sizeof(src);
int r = recvfrom(sock, buf, sizeof(buf)-1, 0, (sockaddr*)&src, &srcSize);
if (r > 0) {
buf[r] = '\\0';
std::cout << "Received: " << buf << std::endl;
}
closesocket(sock);
WSACleanup();
return 0;
}
Error Handling
Common UDP error codes:
WSAEWOULDBLOCK
– operation would block (non‑blocking mode).WSAETIMEDOUT
– packet not received within timeout.WSAECONNRESET
– ICMP Port Unreachable received.