Как функция WSAStartup инициирует использование Winsock DLL?

Как функция WSAStartup инициирует использование Winsock DLL?

Согласно документации

Функция WSAStartup должна быть первая функция Windows Sockets с помощью приложения или DLL. Это позволяет приложения или DLL, чтобы указать требуется версия Windows Sockets и получить информацию о конкретных Реализация Windows Sockets. приложение или DLL могут выдавать дополнительные функции Windows Sockets после успешного вызова WSAStartup.

Эта функция инициализирует структуру данных WSADATA, но при программировании сокетов мы не передаем WSDATA какой-либо функции, так как программа узнает о версии Windows Sockets и других данных?

Например, в этом коде

#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");
}

В этом примере я инициализирую структуру данных WSADATA, используя функцию WSAStartup(), и после опекунов я не прохожу WSADATA в любом месте.

Итак, как моя программа узнает о деталях WSADATA?

Спасибо.

Ответ 1

WSAStartup имеет две основные цели.

Во-первых, он позволяет указать, какую версию WinSock вы хотите использовать (вы запрашиваете 2.2 в своем примере). В WSADATA, который он заполняет, он расскажет вам, какую версию он предлагает вам на основе вашего запроса. Он также заполняет какую-то другую информацию, на которую вам не нужно смотреть, если вас это не интересует. Вам никогда не придется снова отправлять эту структуру WSADATA в WinSock, потому что она используется исключительно для того, чтобы дать вам отзыв по запросу WSAStartup.

Вторая вещь, которую он делает, - настроить все "за кулисами", которые необходимо использовать вашим приложениям. DLL файл WinSock загружается в ваш процесс и содержит множество внутренних структур, которые необходимо настроить для каждого процесса. Эти структуры скрыты от вас, но они видны для каждого из вызовов WinSock, которые вы делаете.

Поскольку эти структуры должны быть настроены для каждого процесса, который использует WinSock, каждый процесс должен вызывать WSAStartup для инициализации структур в пределах своего собственного пространства памяти, а WSACleanup - срывать их снова, когда он будет завершен с использованием сокетов.

Ответ 2

это как вы можете инициализировать WSDATA

WSADATA wsaData={0};

Надеюсь, поможет