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

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

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

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

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

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

 #include  #include  #pragma comment(lib, "ws2_32") void Run(int argc, char* argv[]) { char* host = argc 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 данных WSADATA с помощью функции WSAStartup() а после wsaData я не wsaData нигде.

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

Благодарю.

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

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

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

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