Первым делом создадим пункт меню Tools - Options, где будем указывать всякие опции, в том числе и создание лог файла. Переходите на меню в вкладке Resource и используйте IDR_MAINFRAME для редактирования пунктов меню. Удалите меню File и Edit.
Создадим реакцию на его выбор в классе CHTTPServerView
void CHTTPServerView::OnToolsOptions() { // TODO: Add your command handler code here }
Надо создать диалоговое окно и создать для него класс:
Установить кнопочку выбора check box и для неё создать переменную BOOL m_LogFile;. В конструкторе она инициализируется как
CToolsOptios::CToolsOptios(CWnd* pParent /*=NULL*/) : CDialog(CToolsOptios::IDD, pParent) { //{{AFX_DATA_INIT(CToolsOptios) m_LogFile = FALSE; //}}AFX_DATA_INIT }
Заведем стандартную переменную с именем лог файла:
...... #define PORT_ADDR 80 #define QUEUE_SIZE 25 #define NAMEFILE "FirstStepServer.log" class CSeverWinSock ......
И в классе CServerWinSock переменную, которая будет указывать на то, что нужно вести лог файл.
...... class CSeverWinSock { public: BOOL TestLogFile; void SendData(LPSTR buff); ......
Начальная инициализация:
CSeverWinSock::CSeverWinSock() { TestLogFile=FALSE; }
Организуем вызов диалога, но сначала опишем ссылку на класс.
#include "ToolsOptios.h" //////////////////////// // CHTTPServerView
И вызов диалогового окна.
void CHTTPServerView::OnToolsOptions() { CToolsOptios ctopt; ctopt.m_LogFile=HTTPServer.TestLogFile; if (ctopt.DoModal()==IDOK) HTTPServer.TestLogFile=ctopt.m_LogFile; }
Для создания log файла создадим класс CLogFile. Используя этот класс мы и будет писать информацию в файл.
class CLogFile : public CFile { public: BOOL Create(); CString csFileName; BOOL write(CString writeString); CLogFile(); virtual ~CLogFile(); };
Подключим его описание к реализации класса CServerWinSock.
// SeverWinSock.h: interface for the CSeverWinSock class. //////////////////////////////////////////////////////// //...... #include "winsock.h" # include "LogFile.h"
Обьявим его в классе:
//...... class CSeverWinSock { public: CLogFile cLogFile; //......
При инициализации в переменную класса CLogFile передаем имя файла:
CSeverWinSock::CSeverWinSock() { TestLogFile=FALSE; cLogFile.csFileName=NAMEFILE; cLogFile.Create(); }
Процедура записи:
BOOL CLogFile::write(CString writeString) { CFile file(csFileName, CFile::modeNoTruncate | CFile::modeWrite); file.SeekToEnd(); writeString=writeString+"\r\n"; file.Write(writeString.GetBufferSetLength( writeString.GetLength()),writeString.GetLength()); file.Close(); return TRUE; }
В проекте есть реализация всех записей в лог на данный момент. Мы постоянно будем расширять количество информации помещаемое в лог файл для изучения соединения и его процесса. Пока там отражаются только самые важные события.
Вот пример пример лог файла
09 : 13 :04 Start WinSock 09 : 13 :04 uuobat 09 : 13 :04 Create Soket 09 : 13 :04 bind 09 : 13 :04 WSAAsyncSelect 09 : 13 :04 Listen 09 : 13 :05 StopServer 09 : 13 :05 Close Socket