como - ¿Cómo funciona WSAStartup inicia el uso de la DLL de Winsock?
windows 7 reset winsock (1)
WSAStartup tiene dos propósitos principales.
En primer lugar, le permite especificar qué versión de WinSock desea usar (está solicitando 2.2 en su ejemplo). En el WSADATA que se completa, le dirá qué versión le ofrece en función de su solicitud. También completa otra información que no está obligado a consultar si no está interesado . Nunca tiene que volver a enviar esta estructura de WSADATA a WinSock, ya que se usa exclusivamente para proporcionarle comentarios sobre su solicitud WSAStartup.
Lo segundo que hace es configurar todos los elementos "detrás de escena" que su aplicación necesita para usar sockets. El archivo DLL de WinSock se carga en su proceso y tiene muchas estructuras internas que deben configurarse para cada proceso. Estas estructuras están ocultas para usted, pero son visibles para cada una de las llamadas de WinSock que realice.
Debido a que estas estructuras necesitan configurarse para cada proceso que usa WinSock, cada proceso debe llamar a WSAStartup para inicializar las estructuras dentro de su propio espacio de memoria, y WSACleanup para volver a abrirlas cuando termina de usar sockets.
¿Cómo funciona WSAStartup inicia el uso de la DLL de Winsock?
De acuerdo con la documentación
La función WSAStartup debe ser la primera función de Windows Sockets invocada por una aplicación o DLL. Permite que una aplicación o DLL especifique la versión de Windows Sockets requerida y recupere detalles de la implementación específica de Windows Sockets. La aplicación o DLL solo puede emitir más funciones de Windows Sockets después de llamar con éxito a WSAStartup.
Esta función inicializa la estructura de datos de WSADATA
, pero en la programación de socket no pasamos WSDATA
a ninguna función, entonces, ¿cómo llega a conocer el programa la versión de Windows Sockets y otros detalles?
Por ejemplo en este código
#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");
}
En este ejemplo, estoy inicializando la estructura de datos de WSADATA
usando la función WSAStartup()
y después de wards no estoy pasando wsaData
ningún lado.
Entonces, ¿cómo llega mi programa a conocer los detalles de wsaData
?
Gracias.