Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Efter initieringen måste ett SOCKET- objekt instansieras för användning av klienten.
Skapa en socket
Deklarera ett addrinfo- objekt som innehåller en sockaddr struktur och initiera dessa värden. För det här programmet är Internetadressfamiljen ospecificerad så att antingen en IPv6- eller IPv4-adress kan returneras. Programmet begär att sockettypen ska vara en strömsocket för TCP-protokollet.
struct addrinfo *result = NULL, *ptr = NULL, hints; ZeroMemory( &hints, sizeof(hints) ); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP;Anropa funktionen getaddrinfo och begär IP-adressen för servernamnet som skickas på kommandoraden. TCP-porten på servern som klienten ska ansluta till definieras av DEFAULT_PORT som 27015 i det här exemplet. Funktionen getaddrinfo returnerar dess värde som ett heltal som har kontrollerats efter fel.
#define DEFAULT_PORT "27015" // Resolve the server address and port iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result); if (iResult != 0) { printf("getaddrinfo failed: %d\n", iResult); WSACleanup(); return 1; }Skapa ett SOCKET- objekt med namnet ConnectSocket.
SOCKET ConnectSocket = INVALID_SOCKET;Anropa funktionen socket och returnera dess värde till variabeln ConnectSocket. För det här programmet använder du den första IP-adressen som returnerades av anropet till getaddrinfo som matchade adressfamiljen, sockettypen och protokollet som anges i tips parameter. I det här exemplet angavs en TCP-strömsocket med en sockettyp av SOCK_STREAM och ett protokoll för IPPROTO_TCP. Adressfamiljen lämnades ospecificerad (AF_UNSPEC), så den returnerade IP-adressen kan vara antingen en IPv6- eller IPv4-adress för servern.
Om klientprogrammet bara vill ansluta med IPv6 eller IPv4 måste adressfamiljen anges till AF_INET6 för IPv6 eller AF_INET för IPv4 i tips parameter.
// Attempt to connect to the first address returned by // the call to getaddrinfo ptr=result; // Create a SOCKET for connecting to server ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);Kontrollera om det finns fel för att säkerställa att socketen är en giltig socket.
if (ConnectSocket == INVALID_SOCKET) { printf("Error at socket(): %ld\n", WSAGetLastError()); freeaddrinfo(result); WSACleanup(); return 1; }
Parametrarna som skickas till socket-funktionen kan ändras för olika implementeringar.
Felidentifiering är en viktig del av lyckad nätverkskod. Om socket- anrop misslyckas returneras INVALID_SOCKET. Den om-instruktionen i föregående kod används för att fånga upp eventuella fel som kan ha inträffat när socketen skapades. WSAGetLastError returnerar ett felnummer som är associerat med det senaste felet som inträffade.
Not
Mer omfattande felkontroll kan vara nödvändigt beroende på programmet.
Om du till exempel anger hints.ai_family till AF_UNSPEC kan anslutningsanropet misslyckas. Om det händer använder du i stället ett specifikt IPv4-värde (AF_INET) eller IPv6 (AF_INET6).
WSACleanup- används för att avsluta användningen av WS2_32 DLL.
Nästa steg: Ansluta till en Socket-
Relaterade ämnen