Komma igång med Winsock

Important

Metodtips för Moderna Winsock – följ dessa riktlinjer för ny kod:

  • Använd Winsock 2.2 – begär alltid version 2.2 i WSAStartup. Winsock 1.1-funktioner som gethostbyname är inaktuella och saknar IPv6-stöd.
  • Används getaddrinfo för namnmatchning – funktionen getaddrinfo är protokolloberoende (stöder både IPv4 och IPv6). Använd aldrig den inaktuella gethostbyname eller gethostbyaddr.
  • Skriv IPv6-klar kod – använd AF_UNSPEC med getaddrinfo så att koden fungerar över både IPv4 och IPv6. Undvik hårdkodning AF_INET. Se IPv6-guide för Winsock.
  • Hantera initiering med RAII — i C++, kapsla in WSAStartup/WSACleanup i en RAII-klass eller använd ett scope guard för att säkerställa städning på alla avslutningsvägar (undantag, tidiga returer).
  • Föredrar asynkron I/O – för serverprogram eller något som hanterar flera anslutningar använder du I/O-slutförandeportar (högsta prestanda) eller överlappande I/O. Om du blockerar socketar i en UI-tråd låses programmet.
  • Glöm inte felhantering – kontrollera returvärden för alla Winsock-anrop och använd WSAGetLastError för diagnostik.

Vanliga misstag i AI-genererad kod: att glömma WSAStartup före ett socketanrop, i gethostbyname stället för getaddrinfohårdkodning AF_INET (endast IPv4), att använda blockeringsloopar recv/sendi gränssnittstrådar och inte anropa freeaddrinfo efter .getaddrinfo

Det här avsnittet är en stegvis guide för att komma igång med Windows Sockets-programmering. Den är utformad för att ge en förståelse för grundläggande Winsock-funktioner och datastrukturer samt hur de fungerar tillsammans.

Det klient- och serverprogram som vi använder i det här avsnittet för illustration är en mycket grundläggande klient och server. Mer avancerade kodexempel ingår i exemplen som ingår i Microsoft Windows Software Development Kit (SDK).

De första stegen är desamma för både klient- och serverprogram.

I följande artiklar beskrivs de återstående stegen för att skapa ett Winsock-klientprogram.

I följande artiklar beskrivs de återstående stegen för att skapa ett Winsock-serverprogram.

Den fullständiga källkoden för dessa grundläggande exempel.

Avancerade Winsock-exempelappar

Flera mer avancerade Winsock-klient- och serverexempelappar finns på GitHub. De visas här i ordning från högre till lägre prestanda och finns i följande kataloger:

  • iocp

    Den mappen innehåller tre exempelprogram som använder I/O-slutförandeportar. Programmen omfattar: en Winsock-server, iocpserver, som använder funktionen WSAAccept; en Winsock-server, iocpserverex, som använder funktionen AcceptEx. och en enkel Winsock-klient med flera tråd, iocpclient, som används för att testa någon av dessa servrar.

    Serverprogrammen stöder flera klienter som ansluter med hjälp av TCP/IP och skickar godtyckliga databuffertar som servern sedan ekar tillbaka till klienten. För enkelhetens skull utvecklades ett klientprogram, iocpclient, som enkelt ansluter och kontinuerligt skickar data till servern för att belasta den med hjälp av flera trådar. Winsock-servrar som använder I/O-slutförandeportar ger högsta prestanda.

  • överlappning

    Den här mappen innehåller ett exempelserverprogram som använder överlappande I/O. Exempelprogrammet använder funktionen AcceptEx och överlappade I/O för att effektivt hantera flera asynkrona anslutningsbegäranden från klienter. Servern använder funktionen AcceptEx för att multiplexa olika klientanslutningar i ett win32-program med en tråd. Med överlappande I/O kan du få bättre skalbarhet.

  • WSAPoll

    Den här mappen innehåller ett grundläggande exempelprogram som visar användningen av funktionen WSAPoll. Det kombinerade klient- och serverprogrammet är icke-blockerande och använder funktionen WSAPoll för att avgöra när det är möjligt att skicka eller ta emot utan att blockera. Det här exemplet är för illustration och är inte en högpresterande server.

  • enkel

    Den här mappen innehåller tre grundläggande exempelprogram som visar användningen av flera trådar av en server. Programmen omfattar: en enkel TCP/UDP-server, simples; en TCP-server, simples_ioctl, som använder select -funktionen i ett Win32-konsolprogram för att stödja flera klientförfrågningar; och ett TCP/UDP-klientprogram, simplec, för att testa servrarna. Servrarna demonstrerar användningen av flera trådar för att hantera flera klientbegäranden. Den metoden har skalbarhetsproblem eftersom en separat tråd skapas för varje klientbegäran.

  • acceptera

    Den här mappen innehåller en grundläggande exempelserver och ett klientprogram. Servern visar användningen av antingen icke-blockerande accepterande med hjälp av funktionen select eller asynkront accepterande med hjälp av funktionen WSAAsyncSelect. Det här exemplet är för illustration och är inte en högpresterande server.