Как функция WSAStartup инициирует использование библиотеки Winsock - PullRequest
15 голосов
/ 14 февраля 2011

Как функция 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 Ответ

17 голосов
/ 14 февраля 2011

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

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

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

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

...