- •Крок 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
If (wsaStartup(winsock_version, &wsaData))
{
LogWrite("Initializing Winsock... Failed!\n");
return FALSE;
}
csTmp.Format("Initializing Winsock... Success!\n\n%s\n%s\n\n",
wsaData.szDescription,wsaData.szSystemStatus);
LogWrite(csTmp);
return TRUE;
}
І до SocketGetHostName.
BOOL CServerWinsock::SocketGetHostName()
{
. . . . . . .
LogWrite("Function gethostname... Success!\n");
csTmp.Format("Host name is \"%s\"\n",chInfo);
LogWrite(csTmp);
. . . . . . .
}
Також додамо код для того щоб бачити коли і який клієнт звернувся.
afx_msg LRESULT CHTTPServerView::OnServerAccept(WPARAM wParam, LPARAM lParam)
{
. . . . .
HTTPServer.LogWrite("Accepting connection...\n");
Invalidate();
. . . . .
if (WSAGETSELECTEVENT(lParam) == FD_ACCEPT)
{
. . . . . .
CString csTmp;
HTTPServer.LogWrite("Accepted connection...\n");
csTmp.Format("Remote Addr: %s:%hu\n",
inet_ntoa( socketclientaddr.sin_addr),
ntohs(socketclientaddr.sin_port));
HTTPServer.LogWrite(csTmp);
. . . . . .
closesocket(HTTPServer.clientsocket);
HTTPServer.LogWrite("Client Disconnected!\n");
}
return 0L;
}
Можні звичайно ж і далі, але поки вже досить. Ось як тепер виглядає наш файл звіту.
09:24:45 - Friday, 07 December 2001.... Initializing Winsock... Success!
Microsoft wsock32.dll, ver2.2, 32bit of Apr 22 1999, at 20:29:32.
On Win95.
09:24:45 - Friday, 07 December 2001.... Function gethostname... Success!
09:24:45 - Friday, 07 December 2001.... Host name is "sergey"
09:24:45 - Friday, 07 December 2001.... Creating socket... Success!
09:24:45 - Friday, 07 December 2001.... Binding socket... Success!
09:24:45 - Friday, 07 December 2001.... WSAAsyncSelect... Success!
09:24:45 - Friday, 07 December 2001.... Listening port 8080... Success!
09:24:56 - Friday, 07 December 2001.... Accepting connection...
09:24:56 - Friday, 07 December 2001.... Accepted connection...
09:24:56 - Friday, 07 December 2001.... Remote Addr: 127.0.0.1:1030
09:24:56 - Friday, 07 December 2001.... Client Disconnected!
09:25:01 - Friday, 07 December 2001.... Closing socket... Success!
09:25:01 - Friday, 07 December 2001.... Cleanup Winsock... Success!
Крок 14 – ФункціїWinsock
Функції Берклі
Описані нижче функції блокують WinSock API при виконанні.
accept |
створює новий сокет і підключає його до віддаленого комп’ютеру |
closesocket |
закриває одну зі сторін з’єднання |
connect |
ініціалізує з’єднання зі сторони вказаного сокету |
recv |
приймає дані від з’єднаного сокету |
recfrom |
приймає дані від з’єднаного або не з’єднаного сокету |
select |
керування станом кількох сокетів |
send |
відсилає дані по з’єднаному сокету |
sendto |
відсилає дані по з’єднаному або не з’єднаному сокету |
А ось ці не блокують
bind |
зв’язує локальний адрес з сокетом |
getpeername |
отримує назву точки, з якою сокет з’єднаний |
getsockname |
отримує локальне ім’я сокету |
getsockopt |
отримує додаткову інформацію, поєднану з сокетом |
htonl |
перетворює 32 бітне слово з порядку байтів хоста до мережного порядку байтів |
htons |
перетворює 16 бітне слово з порядку байтів хоста до мережного порядку байтів |
inet_addr |
перетворює рядок з IP адресою у бінарний вигляд для структури IN_ADDR |
inet_ntoa |
перетворює IP адресу з бінарного вигляду у рядок |
ioctlsocket |
керування параметрами сокету |
listen |
переводить сокет у стан, у якому він чекає на з’єднання |
ntohl |
перетворює 32 бітне слово з мережного порядку байтів до порядку байтів хоста |
ntohs |
перетворює 16 бітне слово з мережного порядку байтів до порядку байтів хоста |
setsockopt |
задає опції сокету |
shutdown |
відключає передачу або прийом у сокету |
socket |
створює сокет |