Overview
The Winsock (Windows Sockets) API provides a standardized interface for network communication on Windows operating systems. It implements the Berkeley sockets API with extensions specific to Windows.
Key features:
- Support for IPv4, IPv6, and IPvFuture.
- Asynchronous I/O via overlapped operations.
- Event-driven notification (WSAEventSelect, WSAAsyncSelect).
- High-performance I/O Completion Ports (IOCP).
Functions
Socket Management
| Function | Header | Description |
|---|---|---|
socket | winsock2.h | Creates a new socket.|
closesocket | winsock2.h | Closes an existing socket.|
bind | winsock2.h | Binds a socket to a local address.|
listen | winsock2.h | Marks a socket as passive for incoming connections.|
accept | winsock2.h | Accepts an incoming connection.|
connect | winsock2.h | Initiates a connection to a remote host.|
send | winsock2.h | Sends data on a connected socket.|
recv | winsock2.h | Receives data from a connected socket.|
WSAStartup | winsock2.h | Initializes the Winsock library.|
WSACleanup | winsock2.h | Terminates Winsock usage.
Asynchronous I/O
WSAAsyncSelectWSAEventSelectWSAGetOverlappedResultWSASend/WSARecv
Structures
| Structure | Header | Purpose |
|---|---|---|
sockaddr_in | ws2def.h | IPv4 address.|
sockaddr_in6 | ws2def.h | IPv6 address.|
fd_set | winsock2.h | File descriptor set for select.|
WSAOVERLAPPED | winsock2.h | Overlapped I/O structure.|
WSABUF | winsock2.h | Buffer descriptor for WSASend/WSARecv.|
addrinfo | ws2def.h | Address resolution results.
Constants & Error Codes
Common socket type and protocol constants:
#define SOCK_STREAM 1
#define SOCK_DGRAM 2
#define IPPROTO_TCP 6
#define IPPROTO_UDP 17
#define INADDR_ANY 0x00000000u
#define INVALID_SOCKET (SOCKET)(~0)
#define SOCKET_ERROR -1
Some frequent Winsock error codes (retrieved with WSAGetLastError()):
| Error | Code | Description |
|---|---|---|
| WSAEINVAL | 10022 | Invalid argument.|
| WSAEWOULDBLOCK | 10035 | Operation would block.|
| WSAEADDRINUSE | 10048 | Address already in use.|
| WSAECONNREFUSED | 10061 | Connection refused.|
| WSAETIMEDOUT | 10060 | Connection timed out.
Code Samples
Simple TCP Echo Server (Blocking)
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib")
int main() {
WSADATA wsa;
WSAStartup(MAKEWORD(2,2), &wsa);
SOCKET listenSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
sockaddr_in server{0};
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(8080);
bind(listenSock, (sockaddr*)&server, sizeof(server));
listen(listenSock, 5);
while (true) {
SOCKET client = accept(listenSock, nullptr, nullptr);
char buf[512];
int received = recv(client, buf, sizeof(buf), 0);
if (received > 0) send(client, buf, received, 0);
closesocket(client);
}
closesocket(listenSock);
WSACleanup();
return 0;
}
Asynchronous Connect using Overlapped I/O
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib")
void AsyncConnect(const char* host, const char* port) {
WSADATA wsa; WSAStartup(MAKEWORD(2,2), &wsa);
SOCKET s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
addrinfo hints{0}, *res;
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
getaddrinfo(host, port, &hints, &res);
WSAOVERLAPPED ov = {0};
WSABUF buf = {0};
DWORD flags = 0;
ConnectEx(s, res->ai_addr, (int)res->ai_addrlen, nullptr, 0, nullptr, &ov);
// Wait for completion...
// GetOverlappedResult(s, &ov, &bytes, TRUE, &flags);
freeaddrinfo(res);
closesocket(s);
WSACleanup();
}