Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Функции класса CAsyncSocket Class




Чтобы иметь возможность перехватывать и отвечать на события сокета, нам нужно создать свой собственный класс на основе класса CAsyncSocket. В этом классе будет содержаться его собственная версия функций для обработки событий, а также средства отражения событий на уровне класса диалогового окна, здесь будет использоваться указатель на диалоговое окно родительского класса нашего класса сокета. Этот указатель будет использоваться для осуществления вызова функций каждого события сокета, предварительно осуществим проверку наличия ошибок. Чтобы создать этот класс, выберем в меню Insert | New Class. В диалоговом меню создания нового класса New Class оставим тип класса таким, какой предлагается по умолчанию (MFC), введем имя класса, например, CMySocket, и укажем в качестве базового класса CAsyncSocket в списке доступных базовых классов. Нажимаем кнопку ОК, новый класс вставлен.

После того, как новый класс сокета создан, вставим переменную в класс, который будет использоваться в качестве указателя на родительское диалоговое окно. Указываем тип переменной CDialog*, имя переменной m_pWnd, доступ private. В классе необходимо определить метод, а значит, вставим новую функцию в этот класс. Тип функции void, объявим функцию в виде SetParent(CDialog* pWnd), доступ public. Редактируем созданную функцию.

void CMySocket::SetParent(CDialog *pWnd)

{

//устанавливаем указатель

m_pWnd = pWnd;

}

В классе сокета создаем функции обработки событий. Для создания функции, соответствующей событию OnAccept, вставим новую функцию в класс сокета, тип функции void, опишем функцию в виде OnAccept(int nErrorCode), доступ protected. Редактируем код.

void CMySocket::OnAccept(int nErrorCode)

{

//Есть ошибки?

if (nError == 0)

//Нет, вызываем функцию OnAccept()

((CSockDlg*)m_pWnd)->OnAccept();

}

Вставляем подобные функции для событий OnConnect, OnClose, OnReceive и OnSend. после того, как функции вставлены,нужно вставить заголовочный файл в диалоговое окно нашего приложения в класс сокета.

//MySocket.cpp

//

#include "MySocket.h"

После того, как требуемые функции событий созданы в классе сокета, вставим переменную ,связанную с нашим классом сокета в класс диалогового окна. Для сервера нам потребуется две переменные, одна будет связана с прослушиванием запросов на соединение, а другая - связана с другим приложением. Поскольку у нас существует два объекта сокета, то в диалоговый класс (CSockDlg) вводим две переменные. Обе переменные имеют тип класс сокета (CMySocket) и доступ private. Имя одной переменной m_sListenSocket, эта переменная связана с прослушиванием запроса на соединение, вторая переменная называется , m_sConnectSocket и используется для пересылки сообщения в том и в другом направлении.

После того, как переменная сокета созданы, необходимо написать код, инициализирующий эти переменные. По умолчанию зададим тип приложения, как "клиент", номер порта 4000. Помимо этих параметров установим указатель в объектах сокетов, чтобы они указывали на диалоговый класс. Это можно сделать, если вставить код в функцию OnInitDialog.

Замечание: Имя, соответствующее loopback,-это специальное имя, используемое в протоколе TCP/IP, которое обозначает компьютер, на котором мы работаем. Это внутреннее имя компьютера, превращаемое в адрес 127.0.0.1. Это имя и адрес компьютера, широко используемое в тех случаях, когда требуется осуществить соединение с другим приложением, установленным на том же самом компьютере, на котором мы и работаем.

BOOL CSockDlg::OnInitDialog()

{

CDialog::OnInitDialog();

//…

SetIcon(m_hIcon, FALSE);

//Инициализируем переменные управления

m_iType = 0;

m_strName = "loopback";

m_iPort = 4000;

//обновляем элементы управления

UpDateData(FALSE);

//Устанавливаем указатель

m_sConnectSocket.SetParent(this);

m_sListenSocket.SetParent(this);

retutn TRUE; //}   

57.Посылка и прием сообщения приложением.

Посылаем сообщение и получаем.

Необходимо добавить в приложение функции, которые позволили бы осуществлять прием и посылку сообщений. После того, как между приложениями установлено соединение, пользователь может ввести текстовое сообщение в окно для редактирования, расположенное в центре диалогового окна, затем, нажав кнопку SEND, сообщение посылается другому приложению. Чтобы вставить требуемые функции, выполняемые после нажатия кнопки SEND, вначале необходимо позаботиться о том, чтобы была произведена проверка того, содержится ли в окне какое-либо сообщение, затем определить его длину, потом послать сообщение, а затем добавить сообщение в окно списка. Для вставки функции используем мастер классов, которая будет выполняться после наступления события нажатия кнопки IDC_BSEND. Редактируем функцию.


void CSockDlg::OnBsend()

{

int iLen;

int iSent;

//Обновляем элементы управления в соответствии с переменными

UpdateData(TRUE);

//Есть сообщение для посылки?

if (m_strMessage !="")

{

//Получаем длину сообщения

iLen = m_strMessage.GetLength();

//Посылаем сообщение

iSent=

m_sConnectSocket.Send(LPCTSTR(m_strMessage), iLen};

//Смогли послать?

if (iSent == SOCKET_ERROR)

{

}

else

{

// Добавляем сообщение в список

m_ctlSent.AddString(m_strMessage);

// Обновляем переменные согласно элементам управления

UpdateData(FALSE);

 }}}


Когда срабатывает функция OnReceive, что происходит в момент, когда приходит сообщение, мы извлекаем это сообщение из сокета, используя функцию Receive. После того, как сообщение извлечено, мы преобразуем его в тип String и добавляем его в список полученных сообщений. Эти функции можно создать, если отредактировать существующую функцию OnReceive в диалоговом классе.


 

void CSockDlg::OnReceive()

{

char *pBuf = new char[1025];

int iBufSize = 1024;

int iRcvd;

CString strRecvd;

//Получаем сообщение

iRcvd = m_sConnectSocket.Receive(pBuf, iBufSize);

//Получили что-либо?

if (iRcvd == SOCKET_ERROR)

{

}

else

{

//Отрезаем конец сообщения

pBuf[iRcvd] = NULL;

//Копируем сообщение в CString

strRecvd = pBuf;

//добавляем сообщение в список полученных сообщений

m_ctlRecvd.AddString(strRecvd);

// обновляем переменные в соответствии с элементами управления

UpdateData(FALSE);

}

}


Сейчас можно скомпилировать и запустить две копии приложения, соединив их друг с другом. После того, как соединение будет установлено, можно ввести сообщение в одном приложении и послать его другому приложению.

 





Отладка программ в VS. Точка останова. Установка точек останова. Команды и окна отладки.

Отладка является существенной частью процесса программ-я. Если программа выполняется до конца, но при этом делает не то, что для нее планировалось, нужно выяснить, что же происходит на самом деле. Для этого придется обратиться к отладчику.

Терминология отладки

Очевидно, что при отладке программ ключевым понятием является термин точка останова. Точка останова – это место в прог-ме, в кот-м вы хотите остан-ся. Возможно, вас интересует кол-во выполняемых циклов или место, в которое передается управление внутри оператора if, или место, откуда происходит вызов функции. В точке останова останавливается выполнение программы перед выполнением соответствующего оператора программы. В этом месте вы можете прекратить вып-е программы и перезапустить ее или работать дальше и т.д. Чтобы продолжить выполнение программы, используйте следующие команды.

· Go – выполнять до следующей точки останова или до конца программы, если далее не встретятся точки останова.

· Restart – возобновить выполнение прог-мы с самого начала.

· Step Over – выполнить только след-й оператор и снова остан-ся. Если оператор с точкой останова оказался вызовом функции, выполнить ее полностью и остановиться после возврата из нее.

· Step into – выполнить только следующий оператор, но если он окажется вызовом функции, войти в нее и остановиться на первом же операторе внутри функции.

· Step Out – выполнить всю оставшуюся часть ф-ции и остан-ся на первом же операторе ф-ции, кот-я вызвала данную функцию.

· Run To Cursor – продолжить выполнение программы и остановиться на операторе, на котором находится курсор.

Visual Studio имеет мощный отладчик с богатым пользовательским интерфейсом. Он содержит команды меню, пиктограммы панели инструментов и окна, которые используются только при отладке.

Команды меню

Интерфейс пользователя, выполняющего отладку, включает следующие команды меню.


· Edit->Breakpoints

· View->DebugWidows ->Watch

· View->DebugWidows ->Call Stack

· View->DebugWidows ->Memory

· View->DebugWidows ->Variables

· View->DebugWidows ->Registers

· View->DebugWidows ->Dissassembly

· Build->Start Debug->Go

· Build->Start Debug->Step Into

· Build->Start Debug->Run To Cursor

· Build->Start Debug->Attach to Process

· Build->Debugger Remote Connection


Как только вы приступили к отладке, вместо меню Build появляется меню Debug, включающее следующие пункты.

1.Debug->Go                    8.Debug->Run To Cursor

2.Debug->Restart             9. Debug->Step Into Specific Function

3.Debug->Stop                10.Debugging Debug->Exceptions

4.Debug->Break              11. Debug->Threads

5.Debug->Step Into         12.Debug->Show Next Statement

6.Debug->Step Over       13.Debug->Quick Watch

7.Debug->Step Out

В меню Debug дублируются некоторые из пунктов каскадных меню Build->Start Debug. Рассмотрим отдельные команды меню.



Установка точек останова

Проще всего установить точку останова, поместив курсор на оператор программы, перед выполнением которого вы желаете остановиться. Точка останова устанавливается с помощью клавиши <F9> или пиктограммы Insert/Remove breakpoint панели инструментов Build, которая имеет вид поднятой руки. Красная точка слева от оператора отметит точку останова.

При выборе пункта меню Edit->Breakpoints на экран выводится диалоговое окно для установки простых или условных точек останова. Например, можно остановиться там, где изменяется некоторое значение переменной. Можно также установить условные точки останова, такие как прервать выполнение программы, когда i достигает 100 и не  щелкать на Go 100 раз.

Другие окна для отладки

Memory, Registers, Disassembly – эти окна обеспечивают отладку деталей программы, редко встречающихся в обычной процедуре отладки. С появлением каждой новой версии Visual С++ обст-ва, при кот-х эти окна необх-мы, встреч-ся все реже.

Окно Memory

В окне Memory содержатся шестнадцатеричные значения в каждом байте памяти от Ох00000000 до ОхFFFFFFFF. Просматривать содержимое памяти с его пом-ю утомительно. Для ввода интересующего вас адреса проще исп-ать окно Address. Обычно эти адреса копируются через буфер из окна Variables.

Окно Registers

При отладке на уровне ассемблера бывает полезно анализировать регистры, значения которых можно посмотреть в окне окне Registers.

Окно Disassembly

По умолчанию окно Disassembly заполняет весь экран, заменяя текст программы на С++ в основной рабочей зоне. В нем можно увидеть операторы ассемблера, сгенерированные для программы, написанной на С++.










Последнее изменение этой страницы: 2018-04-12; просмотров: 253.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...