MSDN Documentation

Windows Sockets Direct API

The Windows Sockets API (Winsock) provides a networking interface for Windows-based applications. This section focuses on the core functionalities and advanced features of the Winsock Direct API, enabling robust and efficient network communication.

Overview

Winsock is a standards-based API that allows applications to use TCP/IP protocols for network communication. It provides a flexible and powerful set of functions for developing network-aware applications, from simple client-server models to complex distributed systems.

Key Concepts

  • Sockets: Endpoints for network communication.
  • Protocols: Support for TCP (reliable, connection-oriented) and UDP (unreliable, connectionless).
  • Address Families: Support for IPv4 (AF_INET) and IPv6 (AF_INET6).
  • Buffer Management: Techniques for sending and receiving data efficiently.
  • Error Handling: Understanding and managing Winsock-specific error codes.

Core Functions

Initialization and Cleanup

Socket Creation and Management

Data Transfer

Protocol Information

Advanced Features

  • Asynchronous Operations: Using overlapped I/O with WSAAsyncSelect or WSAOVERLAPPED for non-blocking communication.
  • Socket Options: Configuring socket behavior with setsockopt and getsockopt (e.g., SO_REUSEADDR, TCP_NODELAY).
  • I/O Control: Using ioctlsocket for various socket-specific control operations.
  • Broadcasting and Multicasting: Sending data to multiple hosts simultaneously.
  • Quality of Service (QoS): Utilizing the QoS API for network traffic prioritization.

Example: Simple TCP Client

C++ Example


#include <winsock2.h>
#include <ws2tcpip.h>
#include <iostream>

#pragma comment(lib, "Ws2_32.lib")

int main() {
    WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        std::cerr << "WSAStartup failed: " << iResult << std::endl;
        return 1;
    }

    SOCKET ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ConnectSocket == INVALID_SOCKET) {
        std::cerr << "socket creation failed: " << WSAGetLastError() << std::endl;
        WSACleanup();
        return 1;
    }

    sockaddr_in clientService;
    clientService.sin_family = AF_INET;
    clientService.sin_addr.s_addr = inet_addr("127.0.0.1"); // Target IP
    clientService.sin_port = htons(8080); // Target Port

    if (connect(ConnectSocket, (SOCKADDR*)&clientService, sizeof(clientService)) == SOCKET_ERROR) {
        std::cerr << "connect failed: " << WSAGetLastError() << std::endl;
        closesocket(ConnectSocket);
        WSACleanup();
        return 1;
    }

    std::cout << "Connected to server!" << std::endl;

    // Send data...
    const char* sendbuf = "Hello, server!";
    send(ConnectSocket, sendbuf, strlen(sendbuf), 0);

    // Receive data...
    char recvbuf[512];
    int recvbuflen = 512;
    iResult = recv(ConnectSocket, recvbuf, recvbuflen - 1, 0);
    if (iResult > 0) {
        recvbuf[iResult] = '\0'; // Null-terminate the received data
        std::cout << "Received: " << recvbuf << std::endl;
    } else if (iResult == 0) {
        std::cout << "Connection closing..." << std::endl;
    } else {
        std::cerr << "recv failed: " << WSAGetLastError() << std::endl;
    }

    closesocket(ConnectSocket);
    WSACleanup();
    return 0;
}