Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How does WSAStartup function initiates use of the Winsock DLL?

How does WSAStartup function initiates use of the Winsock DLL?

According to the documentation

The WSAStartup function must be the first Windows Sockets function called by an application or DLL. It allows an application or DLL to specify the version of Windows Sockets required and retrieve details of the specific Windows Sockets implementation. The application or DLL can only issue further Windows Sockets functions after successfully calling WSAStartup.

This function initializes WSADATA data structure, but in socket programming we don't pass WSDATA to any function so how does the program comes to know about the Windows Sockets version and other details?

For example in this code

#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");
}

In this example I am initializing WSADATA data structure using WSAStartup() function and after wards I'm not passing wsaData anywhere.

So how does my program comes to know about wsaData details?

Thanks.

like image 430
Searock Avatar asked Feb 14 '11 12:02

Searock


People also ask

What is use of DLL in Winsock?

Winsock runs as a Windows dynamic link library (DLL) file. That is, it is loaded into the computer when an application needs it but doesn't need to be included as part of the application.

How do I initialize Winsock?

To initialize WinsockCreate a WSADATA object called wsaData. WSADATA wsaData; Call WSAStartup and return its value as an integer and check for errors.

What is Wsadata C++?

WSADATA structure is version 2.2 encoded with the major version number in the low-byte and the minor version number in the high-byte. This version of the current Winsock DLL, Ws2_32. dll, supports applications that request any of the following versions of the Windows Sockets specification: 1.0. 1.1.

What is WSACleanup?

When WSACleanup is called, any pending blocking or asynchronous Windows Sockets calls issued by any thread in this process are canceled without posting any notification messages or without signaling any event objects.


1 Answers

WSAStartup has two main purposes.

Firstly, it allows you to specify what version of WinSock you want to use (you are requesting 2.2 in your example). In the WSADATA that it populates, it will tell you what version it is offering you based on your request. It also fills in some other information which you are not required to look at if you aren't interested. You never have to submit this WSADATA struct to WinSock again, because it is used purely to give you feedback on your WSAStartup request.

The second thing it does, is to set-up all the "behind the scenes stuff" that your app needs to use sockets. The WinSock DLL file is loaded into your process, and it has a whole lot of internal structures that need to be set-up for each process. These structures are hidden from you, but they are visible to each of the WinSock calls that you make.

Because these structures need to be set-up for each process that uses WinSock, each process must call WSAStartup to initialise the structures within its own memory space, and WSACleanup to tear them down again, when it is finished using sockets.

like image 64
Gavi Lock Avatar answered Sep 28 '22 08:09

Gavi Lock