Wie initiiert die WSAStartup-Funktion die Verwendung der Winsock-DLL?

Lesezeit: 3 Minuten

Benutzeravatar von Searock
Seerock

Wie initiiert die WSAStartup-Funktion die Verwendung der Winsock-DLL?

Laut Dokumentation

Die WSAStartup-Funktion muss die erste Windows Sockets-Funktion sein, die von einer Anwendung oder DLL aufgerufen wird. Es ermöglicht einer Anwendung oder DLL, die erforderliche Version von Windows Sockets anzugeben und Details der spezifischen Windows Sockets-Implementierung abzurufen. Die Anwendung oder DLL kann erst nach erfolgreichem Aufruf von WSAStartup weitere Windows Sockets-Funktionen ausgeben.

Diese Funktion wird initialisiert WSADATA Datenstruktur, aber bei der Socket-Programmierung gehen wir nicht weiter WSDATA zu irgendeiner Funktion, wie erfährt das Programm also von der Windows Sockets-Version und anderen Details?

Zum Beispiel in diesem Code

#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32")

void Run(int argc, char* argv[])
{
    char* host = argc < 2 ? "" : argv[1];
    struct hostent* entry = gethostbyname(host);

    if(entry)
    {
        struct in_addr* addr = (struct in_addr*) entry->h_addr;
        printf("IP Address: %s\n", inet_ntoa(*addr));
    }
    else
        printf("ERROR: Resolution failure.\n");
}

int main(int argc, char* argv[])
{
    WSADATA wsaData;

    if(WSAStartup(0x202, &wsaData) == 0)
    {
        Run(argc, argv);
        WSACleanup();
    }
    else
        printf("ERROR: Initialization failure.\n");
}

In diesem Beispiel initialisiere ich WSADATA Datenstruktur verwenden WSAStartup() Funktion und danach gehe ich nicht weiter wsaData überall.

Also, wie kommt mein Programm zu wissen wsaData Einzelheiten?

Danke.

WSAStartup hat zwei Hauptzwecke.

Erstens können Sie angeben, welche Version von WinSock Sie verwenden möchten (in Ihrem Beispiel fordern Sie 2.2 an). In den WSADATA, die es auffüllt, wird es Ihnen sagen, welche Version es Ihnen basierend auf Ihrer Anfrage anbietet. Es füllt auch einige andere Informationen aus die Sie sich bei Nichtinteresse nicht anschauen müssen. Sie müssen diese WSADATA-Struktur nie wieder an WinSock senden, da sie ausschließlich dazu dient, Ihnen Feedback zu Ihrer WSAStartup-Anfrage zu geben.

Die zweite Sache, die es tut, ist die Einrichtung aller Dinge “hinter den Kulissen”, die Ihre App benötigt, um Sockets zu verwenden. Die WinSock-DLL-Datei wird in Ihren Prozess geladen und hat eine ganze Menge interner Strukturen, die für jeden Prozess eingerichtet werden müssen. Diese Strukturen sind für Sie verborgen, aber für jeden Ihrer WinSock-Aufrufe sichtbar.

Da diese Strukturen für jeden Prozess eingerichtet werden müssen, der WinSock verwendet, muss jeder Prozess WSAStartup aufrufen, um die Strukturen in seinem eigenen Speicherbereich zu initialisieren, und WSACleanup, um sie wieder abzubauen, wenn er mit der Verwendung von Sockets fertig ist.

  • Siehe außerdem diesen Link: stackoverflow.com/questions/1869689/… zu einer früheren Frage, die ich gestellt und die Antwort durch Selbstfindung entdeckt habe.

    – Hookenz

    14. Februar 2011 um 14:16 Uhr

  • @Gavin, warum muss Windows gestartet werden, während Nix-Umgebungen ohne gut sind?

    – Schrittmacher

    4. März 2017 um 11:40 Uhr

  • @ Pacerier Microsoft.

    – c00000fd

    5. Oktober 2021 um 18:39 Uhr

  • @ Pacerier: Es ist hauptsächlich eine historische Sache. Winsock wurde ursprünglich für Windows 3.x erfunden, in Zeiten, bevor TCP/IP seine Konkurrenten (NetBIOS, IPX/SPX, AppleTalk, DECnet usw.) klar besiegt hatte. Jeder Protokollstapel war eine DLL, und WSAStartup las die Konfiguration, um zu entscheiden, welche DLLs geladen werden sollten. Ein Großteil des Netzwerkstapels lebte im “Benutzerraum”. Heutzutage wird kaum etwas anderes als TCP/IP verwendet, das größtenteils im Kernel lebt, die User-Space-DLLs sind nur dünne Schichten über den Kerneltreibern usw. Aber die Notwendigkeit, WSAStartup aufzurufen, bleibt aufgrund dieser Geschichte bestehen.

    – Simon Kissane

    4. Januar um 21:52 Uhr

1443630cookie-checkWie initiiert die WSAStartup-Funktion die Verwendung der Winsock-DLL?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy