2011-02-14 9 views
11

¿Cómo funciona WSAStartup inicia el uso de la DLL de Winsock?¿Cómo funciona WSAStartup inicia el uso de la DLL de Winsock?

De acuerdo con la documentación

La función WSAStartup debe ser el primera función de Windows sockets llamada por una aplicación o DLL. Permite una aplicación o una DLL para especificar la versión de Windows Sockets required y recuperar detalles de la implementación específica de Windows Sockets . La aplicación o DLL solo puede emitir otras funciones de Windows Sockets después de llamar con éxito a WSAStartup.

Esta función inicializa WSADATA estructura de datos, pero en la programación del zócalo que no pasan WSDATA a cualquier función de modo, ¿cómo el programa llega a saber acerca de la versión de Windows Sockets y otros detalles?

Por ejemplo, en el 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 estructura de datos utilizando WSADATAWSAStartup() función y después de las salas no estoy pasando wsaData en cualquier lugar.

Entonces, ¿cómo llega a saber mi programa wsaData detalles?

Gracias.

Respuesta

14

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 todas las cosas "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 deben 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 derribarlas nuevamente, cuando termina de usar sockets.

+1

Además, consulte este enlace: http://stackoverflow.com/questions/1869689/is-it-possible-to-tell-if-wsastartup-has-been-called-in-a-process en un anterior pregunta que hice y descubrí la respuesta a través del autodescubrimiento. – Matt

+0

Gracias por la explicación. – Searock

+0

@Matt H Gracias por la información adicional. – Searock

Cuestiones relacionadas