- •Крок 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 chttpServerView::OnToolsOptions()
{
// TODO: Add your command handler code here
CToolsOptions ctopt;
ctopt.m_LogFile=HTTPServer.TestLogFile;
if (ctopt.DoModal()==IDOK) HTTPServer.TestLogFile=ctopt.m_LogFile;
}
Для створення файлу звіту створимо клас CLogFile. Використовуючи це цей клас ми й будемо записувати інформацію до файлу.
class CLogFile
{
public:
CString csFileName;
BOOL Create();
BOOL Write(CString writeString);
CLogFile();
virtual ~CLogFile();
};
Підключимо його опис до реалізації класу CServerWinsock.
// ServerWinsock.h: interface for the CServerWinsock class.
//
//////////////////////////////////////////////////////////////////////
#include <winsock.h>
#include "LogFile.h"
Об’явимо його у класі
class CServerWinsock
{
public:
CLogFile cLogFile;
. . . . . . . .
При ініціалізації у змінну класу CLogFile передаємо ім’я файлу
CServerWinsock::CServerWinsock()
{
TestLogFile=false;
cLogFile.csFileName=NAMEFILE;
cLogFile.Create();
}
Функція запису
BOOL CLogFile::Write(CString writeString)
{
CFile file(csFileName, CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite);
file.SeekToEnd();
file.Write((LPCTSTR)writeString, writeString.GetLength());
file.Close();
return true;
}
Також додамо функцію LogWrite до класу CServerWinsock.
Void cServerWinsock::LogWrite(cString csStr)
{
if (TestLogFile) {
cLogFile.Write((CTime::GetCurrentTime()).Format("%H:%M:%S - %A, %d %B %Y...."));
cLogFile.Write(csStr);
}
}
Замінюємо виклик усіх функцій AfxMessageBox на LogWrite. Ми постійно будемо розширювати кількість інформації, що буде додаватися до файлу звіту для вивчення процесу з’єднання і його процесу. Поки що там відображаються лише найбільш важливі події.
Приведемо файл звіту
08:21:40 - Friday, 07 December 2001....Initializing Winsock... Success!
08:21:40 - Friday, 07 December 2001....Function gethostname... Success!
Host name is "ABCXYZ"
08:21:40 - Friday, 07 December 2001....Creating socket... Success!
08:21:40 - Friday, 07 December 2001....Binding socket... Success!
08:21:40 - Friday, 07 December 2001....WSAAsyncSelect... Success!
08:21:40 - Friday, 07 December 2001....Listening port 8080... Success!
08:21:51 - Friday, 07 December 2001....Closing socket... Success!
08:21:51 - Friday, 07 December 2001....Cleanup Winsock... Success!
Крок 13 – Розширюємо інформативність файлу звіту
Отримати інформацію про Winsock.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 iMaxUdpDg;
char FAR * lpVendorInfo;
} WSADATA;
wVersion – версія, підтримка якої очікується.
wHighVersion – максимальна версія, з якою можна працювати. За звичай вони співвпадають.
szDescription – текстовий рядок з описом
szSystemStatus – знову текстовий рядок з описом але цей рядок пов’язаний з операційною системою.
Останні нам не цікавлять, та у версії 2 і вище повинні ігноруватися.
Вносимо зміни до коду ініціалізації Winsock.
BOOL CServerWinsock::StartWinsock()
{
WSADATA wsaData;
CString csTmp;