Microsoft Docs

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:

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:

References