| Форум| Гостевая| Ссылки| Программы| Исходные тексты| Наши партнеры.|
   
| Главная| Рассылки| Услуги| Библиотека| Новости| Авторам| Программистам| Студентам|
delphi c++ assembler
 

Шаг 8 - Соединение с сервером

Создаем проект

Запускайте VC и выбирайте MFC AppWizard, имя проекту дайте HTTPServer. На шаге 1 поставьте Single Document, на шаге 3 отключите ActiveX Control нам пока это не нужно, на шаге 4 отключите всё, и жмите Finish.

Создаем код

Давайте на основе прошлых шагов создадим класс CSeverWinSock. Переходите в ClassView, нажимайте правую кнопку мыши и выбирайте Add New Class. Выбирите Generic Class внесите имя и жмите OK, я не буду разбирать подробности переноса, скажу только, что все функции printf поменяю на AfxmessageBox, и все функции из void станут BOOL. Посмотрите проект. Но описание класса и две важные функции приведу.
class CSeverWinSock  
{
public:
	CSeverWinSock();
	virtual ~CSeverWinSock();
	BOOL StartWinSock();
	BOOL SocketGetHostName();
	BOOL CreateSocket();
	BOOL LinkWindowSocket(HWND m_hWnd);
	BOOL ListenSocket();
	void CloseScoket();
    BOOL LinkSoketPort();
	BOOL StopWinSock();
	BOOL StartServer(HWND m_hWnd);
	void StopServer();
private:
	SOCKET servsocket;

};


void CSeverWinSock::StopServer()
{
 CloseScoket();
 StopWinSock();
}

BOOL CSeverWinSock::StartServer()
{
	if (!StartWinSock()) return FALSE;
        if (!SocketGetHostName()) return FALSE;
	if (!CreateSocket()) return FALSE;
	if (!LinkSoketPort()) return FALSE;
        if (!LinkWindowSocket(m_hWnd)) return FALSE;
	if (!ListenSocket()) return FALSE;
	return TRUE;
}
Итак нам нужно запустить и остановить сервер. Мы будем это делать по нажатию левой кнопки мыши - запускать, правой - останавливать. Но сначала заведем переменную csInfo для вывода на экран состояния. Мы опишем её в классе CHTTPServerDoc и там же инициализируем.
.....
// Implementation
public:
	CString csInfo;
	virtual ~CHTTPServerDoc();
#ifdef _DEBUG
	virtual void AssertValid() const;
	virtual void Dump(CDumpContext& dc) const;
#endif
......
BOOL CHTTPServerDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	csInfo="Stop Server";

	return TRUE;
}
В классе CHTTPServerView опишем вывод на экран.
void CHTTPServerView::OnDraw(CDC* pDC)
{
	CHTTPServerDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	
	pDC->TextOut(10,10,pDoc->csInfo);  
}
В классе CHTTPServerView заведем логическую переменную blTestStartServer и в конструкторе скажем, что она FALSE - типа сервер стоит.
CHTTPServerView::CHTTPServerView()
{
	blTestStartServer=FALSE;
}
Добавим для класса CHTTPServerView реакцию на нажатие правой и левой кнопки мыши. А также в описание этого класса ссылку на наш заголовочный файл.
#pragma once
#endif // _MSC_VER > 1000

#include "SeverWinSock.h"
Включим в описание класса CHTTPServerView экземпляр класса CSeverWinSock
public:
	BOOL blTestStartServer;
	virtual ~CHTTPServerView();
	CSeverWinSock  HTTPServer;
#ifdef _DEBUG
Ну вот и всё готово. Теперь можно обрабатывать нажатие мышки.
/////////////////////////////////////////////////////////////////////////////
// CHTTPServerView message handlers

void CHTTPServerView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	
	if (!blTestStartServer)
	{
	if (HTTPServer.StartServer(m_hWnd))
	{
		CHTTPServerDoc* pDoc = GetDocument();
		ASSERT_VALID(pDoc);
		pDoc->csInfo = "Server Start"; 
		Invalidate();
		blTestStartServer=TRUE;
	}
	}
	CView::OnLButtonDown(nFlags, point);
}

void CHTTPServerView::OnRButtonDown(UINT nFlags, CPoint point) 
{
	
	HTTPServer.StopServer();
	CHTTPServerDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	pDoc->csInfo = "Server Stop"; 
	Invalidate();
	blTestStartServer=FALSE;
	CView::OnRButtonDown(nFlags, point);
}
Когда к серверу обратится клиент будет сгенерировано сообщение WM_SERVER_ACCEPT, отловом которого мы займемся.
BEGIN_MESSAGE_MAP(CHTTPServerView, CView)
	//{{AFX_MSG_MAP(CHTTPServerView)
	ON_WM_LBUTTONDOWN()
	ON_WM_RBUTTONDOWN()
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_SERVER_ACCEPT,OnServerAccept)
END_MESSAGE_MAP()

afx_msg LRESULT CHTTPServerView::OnServerAccept(WPARAM wParam, LPARAM lParam)
{
	CHTTPServerDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	pDoc->csInfo = "Client Connect !!!!!"; 
	Invalidate();
	return 0L;
}
Надо устранить еще одну ошибку допушенную мною в прошлом шаге, при указании порта в LinkSoketPort. Это функция конвертации.
	socketaddr.sin_port = htons(PORT_ADDR);
Собирайте проект. Устанавливайте связь с интернетом и запускайте.

А вот теперь нужно протестировать. Я тестировал на Windows 98 с удаленным доступом к Internet. Так как IP адрес динамический я его посмотрел используя IPconfig и ввел в Exploler. Вот смотрите рисунок ниже. Конечно соединение прошло, но Internet Explorer нечего не показал, хотя пытался. Конечно :-) Нужен код типа Client_Read, но мы его сделаем :-) в следующем шаге.

Рисунок 8 [step8.gif (15583 b)]


Загрузить проект | Предыдущий шаг | Следующий Шаг | Оглавление

By Artem.
Используются технологии uCoz
 

Rambler's Top100 Rambler's Top100

©  Adept Design Studio

Используются технологии uCoz