- •Крок 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
Void cServerWinsock::SendData(lpctstr buf, int len)
{
if (send(clientsocket, buf, len, 0)==SOCKET_ERROR)
{
CString tmp;
tmp.Format("Sending Error! Code: %d", WSAGetLastError());
AfxMessageBox(tmp);
}
}
Після посилки даних сокет можна закрити.
Взагалі увесь даний процес з боку сервера можна уявити так:
socket()
bind()
WSAAsyncSelect()
listen()
If accept() send()
closesocket()
Крок 10 – Порядок байтів
Машини з різною архітектурою зберігають дані використовуючи різні порядки байтів. Наприклад, машини, які базуються на архітектурі Intel, зберігають дані у зворотному порядку у порівнянні з Макінтошами (Motorola). Порядок байтів фірми Intel називається “молодший - перший” і також являється зворотнім до мережного стандарту “старший - перший”. Наступна таблиця пояснить все це.
Порядок байтів “молодший – перший” та “старший – перший” у оперативній пам’яті
Порядок байтів |
Значення |
“молодший – перший” |
Найбільш вагомий байт знаходиться на правому кінці слова |
“старший – перший” |
Найбільш вагомий байт знаходиться на лівому кінці слова |
Звичайно, вам не треба перейматися порядком байтів для даних, які ви посилаєте та приймаєте по мережі, але є ситуації, в яких ви повинні перетворювати порядок байтів.
Коли Ви повинні перетворювати порядок байтів
Ви повинні перетворювати порядок байтів у наступних ситуаціях:
Ви передаєте інформацію, яка повинна бути інтерпретована мережею, у протилежність даним, які ви відсилаєте до іншої машини. Наприклад, Ви можете передавати номера портів та адреси, які мережа повинна розуміти.
Серверна програма, з якою ви зв’язуєтесь, не є програмою MFC (або у вас нема тексту цієї програми). Це закликає до перетворень порядку байтів, якщо ці дві машини мають неоднаковий порядок байтів.
Коли Вам не потрібно перетворювати порядок байтів
Ви можете уникнути роботи по перетворенню порядку байтів у наступних ситуаціях:
Машини на обох кінцях можуть домовитися не переставляти байти або ці машини використовують однаковий порядок байтів.
Сервер, з яким Ви зв’язуєтесь, є програмою MFC.
Ви маєте тексти програм для сервера, з яким ви зв’язуєтесь, так що Ви можете явно вказати, де повинен перетворюватися порядок байтів, а де – ні.
Ви можете переписати сервер на MFC.
Це зазвичай дуже легко зробити, і результатом буде менший та більш швидкий код.
Функції перетворення порядку байтів у Windows Sockets
Функція |
Призначення |
ntohs |
Конвертує 16-бітне слово з мережного порядку байтів до порядку байтів хоста |
ntohl |
Конвертує 32-бітне слово з мережного порядку байтів до порядку байтів хоста |
htons |
Конвертує 16-бітне слово з порядку байтів хоста до мережного порядку байтів |
htonl |
Конвертує 32-бітне слово з порядку байтів хоста до мережного порядку байтів |
Ми користувалися цими функціями при виклику bind.
BOOL CServerWinsock::BindSocket()
{
SOCKADDR_IN socketaddr;
socketaddr.sin_family = AF_INET;
socketaddr.sin_addr.s_addr = INADDR_ANY;
socketaddr.sin_port = htons(PORT_ADDR);