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

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

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

Функция WSAStartup должна быть первой функцией Windows Sockets, вызываемой приложением или DLL. Это позволяет приложению или библиотеке DLL указывать требуемую версию сокетов Windows и получать сведения о конкретной реализации сокетов Windows. Приложение или 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.

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

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

Другие вопросы по тегам