- •Крок 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 (bind(servsocket, (lpsockaddr) &socketaddr, sizeof(socketaddr)))
{
printf("Binding socket... Failed!\n");
return FALSE;
}
printf("Binding socket... Success!\n");
return TRUE;
}
Крок 11 – Чотири етапи транзакціїHTTP
Встановлення з’єднання
Перед обміном інформацією клієнт та сервер повинні мати з’єднання TCP
Запит клієнта
Кожний запит клієнта, який посилається до WEB- сервера, починається з метода (GET, POST, PUT, OPTIONS), за яким слідує URL об’єкту (наприклад http://localhost/) та символ повернення каретки з символом переводу рядку. Метод – це команда клієнту до сервера.
Відповідь сервера
Після отримання запиту сервер його аналізує і потрібну відповідь оформлює в повідомлення HTTP, яке він відсилає клієнту. Повідомлення HTTP (як запит так і відповідь) складається із двох частин – заголовку та тіла. Заголовок відповіді має вигляд: спочатку йде слово “HTTP/”, потім версія (наприклад HTTP/1.0, на даний момент є тільки дві версії 1.0 та 1.1), пробіл, потім – код статусу, десяткове число з трьома розрядами (наприклад 200, що значить – “усе гаразд”), потім знову пробіл і коментар сервера до коду статусу та символ повернення каретки з символом переводу рядку. Після заголовку йде пустий рядок, тобто знов пара символів - символ повернення каретки з символом переводу рядку. Потім йде документ у форматі HTML.
Наприклад:
HTTP/1.0_200_OK CRLF CRLF
(“_” означає пробіл, а CRLF символ – повернення каретки з символом переводу рядка)
Ось і в нас так
CString buff="HTTP/1.0 200 OK\n\n\
<HTML>\
<TITLE> Simple HTTP Server</TITLE>\
<BODY>\
<P>\
<FONT size=\"7\">Our Server Working Perfectly!!!\
</BODY>\
</HTML>";
HTTPServer.SendData(buff, buff.GetLength());
Розрив зв’язку
Після відправлення повідомлення сервер може розірвати зв’язок. У версії HTTP 1.0 це робиться завжди, а ось вже у версії HTTP 1.1 є параметр, що передається до сервера при запиті, який каже серверу щоб бажано було не обривати з’єднання.
Ми ж після кожної відправки повідомлення розриваємо зв’язок.
closesocket(HTTPServer.clientsocket);
Крок 12 – Робимо файл звіту
Першим ділом створимо пункт меню Tools->Options, де будемо вказувати усілякі опції, у тому числі і створення файлу звіту. Переходьте на меню у вкладці Resource і використовуйте ресурс IDR_MAINFRAME для редагування пунктів меню. Видаліть меню File і Edit.
Створимо реакцію на його вибір у класі CHTTPServerView.
Void chttpServerView::OnToolsOptions()
{
// TODO: Add your command handler code here
}
Треба створити діалогове вікно і створити для нього клас.
Встановити кнопку вибору Check Box і для неї створити змінну BOOL m_LogFile; У конструкторі вона ініціалізується так
CToolsOptions::CToolsOptions(CWnd* pParent /*=NULL*/)
: CDialog(CToolsOptions::IDD, pParent)
{
//{{AFX_DATA_INIT(CToolsOptions)
m_LogFile = FALSE;
//}}AFX_DATA_INIT
}
Заведемо змінну з ім’ям файлу
#define PORT_ADDR 8080
#define QUEUE_SIZE 50
#define NAMEFILE "HTTPServer.log"
class CServerWinsock
І у класі CServerWinsock змінну, яка буде вказувати на те, що потрібно вести файл звіту.
class CServerWinsock
{
public:
BOOL TestLogFile;
Початкова ініціалізація
CServerWinsock::~CServerWinsock()
{
TestLogFile = FALSE;
}
Додамо виклик діалогу, але спочатку підключимо файл класу діалогу у HTTPServerView.cpp.
#include “ToolsOptions.h”
/////////////////////////////////////////////////////////////////////////////
// CHTTPServerView