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

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

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

функция WSAStartup должна быть первая функция сокетов под Windows приложения или DLL. Он позволяет приложение или DLL для указания требуется версия сокетов Windows и извлеките детали специфического Реализация сокетов Windows. Этот приложение или DLL могут только выдавать дополнительные функции сокетов Windows после успешного вызова 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: %sn", 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, чтобы снова удалить их, когда он закончит использовать сокеты.