Winsock или Windows Sockets – это интерфейс программирования приложений (API) созданный для реализации программ в сети на основе протоколов TCP/IP.
При взаимодействии «клиент – сервер» в сети каждого участника взаимодействия можно рассматривать как конечную точку или другими словами сокет. Windows Sockets разрабатывался на основе интерфейса Беркли для UNIX (или BSD сокетов), но к ним добавлены функции поддержки событий Windows. Таким образом, несмотря на то, что рассмотрены только Windows Sockets, в целом программирование сокетов в UNIX системах и Windows похоже.
В настоящее время существует две основные версии Winsock API:
1. WinSock 1.1 – осуществляется поддержка только протоколов TCP/IP;
2. WinSock 2.0 – введена возможность работы с самыми разными сетевыми протоколами и моделями, например SPX/IPX.
Официальная спецификация Winsock разделяет функции на три типа:
1. функции Беркли;
2. информационные функции (получение информации о наименовании доменов, службах, протоколах Интернета);
3. расширения Windows для функций Беркли.
Все функции могут быть блокирующие и неблокирующие. Обычно блокирующие это функции Беркли. То есть при работе такой функции нельзя выполнять другие функции WinSock.
Код программы, осуществляющей инициализацию интерфейса Winsock API (WSA) и его деинициализацию следующий:
#include <stdio.h>
#include <winsock.h>
const int WINSOCK_VERSION = 0x0101;
void main()
{
WSADATA wsaData;
if (WSAStartup(WINSOCK_VERSION, &wsaData))
printf(“Winsock startup FAILED!\n”);
else
printf(“Winsock startup is successful.\n”);
if (WSACleanup())
printf(“Winsock cleanup FAILED!\n”);
else
printf(“Winsock cleanup is successful.\n”);
system(«pause»);
return;
}
Программа скомпилирована как консольный проект Win32. Для успешной линковки необходимо добавить в список зависимостей приложения файл wsock32.lib, входящий в состав любого современного компилятора C++ для Windows.
С помощью #include <winsock.h> подключаются библиотечные функции. Далее объявляется константа с номером версии, с которой будет работать приложение – WINSOCK_VERSION.
Функция WSAStartup() инициализирует Winsock. Эта функция всегда вызывается самой первой при начале работы с Winsock. Ее прототип следующий:
int WSAStartup (WORD wVersionRequested, LPWSADATA lpWSAData);
Первый параметр – это версия, которая будет использоваться. Младший байт – основная версия, старший байт – расширение версии. То есть в примере, используется версия 1.1. Если инициализация состоялась, то вернется нулевое значение. Инициализация заключается в сопоставлении номера версии и реально существующей библиотеки динамической компоновки (файла с расширением DLL) в системной папке Windows.
Второй параметр – это указатель на структуру WSADATA, в которую возвратятся параметры инициализации. Структура имеет следующее определение:
typedef struct WSAData {
WORD wVersion;
WORD wHighVersion;
char szDescription[WSADESCRIPTION_LEN+1];
char szSystemStatus[WSASYS_STATUS_LEN+1];
unsigned short iMaxSockets;
unsigned short iMaxUdpDg;
char FAR * lpVendorInfo;
} WSADATA, FAR * LPWSADATA;
WSACleanup() завершает использование данного DLL файла и прерывает обращение к функциям Winsock. При удачном выполнении вернется ноль. Результат успешной работы программы приведен на рисунке 2.4.1.
Рисунок 2.4.1 – Инициализация и деинициализация Winsock API
В состав Winsock входит ряд информационных функций, например, для получения сведений об имени компьютера в сети или IP – адреса. Рассмотрим простой пример, выводящий на экран имя локальной машины.