- •Крок 1 – Що такеWindows Sockets
- •Крок 2 – Ініціалізація
- •Крок 3 – Отримання імені хоста
- •If (bind(servsocket, (lpsockaddr)
- •Int bind(
- •Int namelen
- •Крок 6 – Зв’язок вікна з сокетом для отримання повідомлень
- •Назву вікна визначимо як
- •Void BindSocket();
- •Int listen (
- •Void StopServer();
- •If (!cDocument::OnNewDocument())
- •Void chttpServerView::OnDraw(cdc* pDc)
- •Void chttpServerView::OnLButtonDown(uint nFlags, cPoint point)
- •Invalidate();
- •Крок 9 – Відсилаємо документ
- •Invalidate();
- •If (wsagetasyncerror(lParam))
- •Void cServerWinsock::SendData(lpctstr buf, int len)
- •If accept() send()
- •Крок 10 – Порядок байтів
- •Коли Ви повинні перетворювати порядок байтів
- •Коли Вам не потрібно перетворювати порядок байтів
- •Функції перетворення порядку байтів у Windows Sockets
- •If (bind(servsocket, (lpsockaddr) &socketaddr, sizeof(socketaddr)))
- •Розрив зв’язку
- •Крок 12 – Робимо файл звіту
- •Void chttpServerView::OnToolsOptions()
- •Void chttpServerView::OnToolsOptions()
- •Void cServerWinsock::LogWrite(cString csStr)
- •If (wsaStartup(winsock_version, &wsaData))
- •Invalidate();
- •Функції адрес
- •Функції розширення Microsoft Winsock
Сергій Лещенко
ОСНОВИ
РОБОТИ
З
Winsock
за 14 кроків
ЗМІСТ
Крок 1 – Що таке Windows Sockets 4
Крок 2 – Ініціалізація 5
Крок 3 – Отримання імені хоста 8
Крок 4 – Створюємо сокет 9
Крок 5 – Зв’язок сокету з портом 11
Крок 6 – Зв’язок вікна з сокетом для отримання повідомлень 14
Крок 7 – Сокет, що очікує 18
Крок 8 – З’єднання з сервером 19
Крок 9 – Відсилаємо документ 27
Крок 10 – Порядок байтів 29
Крок 11 – Чотири етапи транзакції HTTP 32
Крок 12 – Робимо файл звіту 34
Крок 13 – Розширюємо інформативність файлу звіту 39
Крок 14 – Функції Winsock 43
Крок 1 – Що такеWindows Sockets
Winsock або Windows sockets – це програмний інтерфейс (API) розроблений для реалізації програмного забезпечення в мережі на основі протоколу TCP/IP. Тобто це є просто група функцій. Усі ці функції знаходяться у системній бібліотеці WSOCK32.DLL, яка динамічно завантажується.
Програма
WSOCK32.DLL
TCP/IP
Практично це є інтерфейс до протоколу TCP/IP.
При взаємодії клієнт – сервер у мережі, кожного учасника взаємодії можна розглядати як кінцеву точку. Сокет це начебто як і є ця кінцева точка. У програмі ви визначаєте сокет. І хоча програмування сокетів під UNIX і Windows схоже, ми будемо розглядати саме Windows sockets.
До речі Windows sockets розроблялися на основі інтерфейсу сокетів Берклі для UNIX, але до них були додані функції підтримки подій Windows.
Є дві версії Winsock:
Winsock 1.1 – підтримка тільки TCP/IP
Winsock 2.0 – підтримка додаткового програмного забезпечення
Специфікація Winsock поділяє функції на три типи.
Функції Берклі
Інформаційні функції (отримання інформації про найменування доменів, служби, протоколи Internet
Розширення Windows для функцій Берклі
Усі функції можуть бути як ті що блокують так не блокують. Звичайно ті функції що блокують це функції Берклі. Тобто при роботі такої функції не можна виконувати інші функції Winsock.
Давайте розглянемо як робиться підключення до сервера. Спочатку програма підключається к адресу IP зі створенням сокету. Програма буде чекати підключення. Для підключення програма клієнт також створює сокет і намагається підключитися до сокету сервера. Як тільки сервер побачить спробу підключення він створює новий сокет, і цей новий сокет буде використовуватися для взаємодії з клієнтом. А той, до якого була спроба підключення буде чекати наступного. На цій основі робиться взаємодія сервера і багатьма програмами.
Сам сокет може бути створений на основі протоколу
TCP (transport control protocol) – надійне з’єднання
UDP (user datagram protocol) – ненадійне з’єднання
Крок 2 – Ініціалізація
Створіть проект Win32 Console з ім’ям Winsock1, на питання про тип у діалоговому вікні вкажіть “Hello Word” application. Після цього є необхідність підключення LIB файлу. Це робиться у меню Project, далі Link і Object/Library modules. Туди треба вписати Wsock32.lib. Ось як це повинно виглядати.
А ось і код програми.
#include "stdafx.h"
#include "winsock.h"
const int WINSOCK_VERSION=0x0101;
int main(int argc, char* argv[])
{
WSADATA wsaData;
if (WSAStartup(WINSOCK_VERSION, &wsaData))
printf("Startup Winsock... Failed!\n");
else
printf("Startup Winsock... Success!\n");
if (WSACleanup())
printf("Cleanup Winsock... Failed!\n");
else
printf("Cleanup Winsock... Success!\n");
return 0;
}
За допомогою #include “winsock.h” підключаємо бібліотечні функції. Об’являємо константу з номером версії, котру ми будемо підтримувати - WINSOCK_VERSION.
Функція WSAStartup ініціалізує Winsock. Цю функцію треба викликати завжди перед тим як користуватися іншими функціями Winsock. Ось як вона описана.
int WSAStartup (
WORD wVersionRequested,
LPWSADATA lpWSAData );
Перший параметр – це версія, котра буде використовуватися. Молодший байт – основна версія, старший байт – розширення версії. Якщо ініціалізація не відбулася, то повернеться нульове значення. Взагалі ініціалізація полягає у зіставленні номера версії і реально існуючої DLL у системі.
Другий параметр – це покажчик на структуру WSADATA, у котру повернуться параметри ініціалізації.
typedef struct WSAData {
WORD wVersion;
WORD wHighVersion;
char szDescription[WSADESCRIPTION_LEN+1];
char szSystemStatus[WSASYS_STATUS_LEN+1];
unsigned short iMaxSockets;
unsigned short iMaxUpdDg;
char far * lpVendorInfo;
} WSADATA, FAR * LPWSADATA;
Функція WSACleanup завершує використання даної DLL і перериває звернення до функцій Winsock. При вдалому виконанні повертає нуль. Цю функцію потрібно викликати рівно стільки, скільки раз була викликана функція WSAStartup.