Кодим сокеты на MFC

cuttah (cutter@real.xakep.ru)

Xakep, номер #061, стр. 061-090-2


if (m_stat[x][y]==2) {

dc.DrawState(CPoint (posx, posy), picsize, &bmp_o, DST_BITMAP);

}

}

Все. Теперь поле будет отображаться, но отвечать на клики оно не станет. Чтобы оно стало кликабельным, добавь событие OnLButtonUp. Оно будет вызываться каждый раз, когда ты кликнешь левой кнопкой на диалоговом окне. Приводить код изменения содержимого поля я не буду, его ты можешь посмотреть в конечном варианте программы. Там все легко, и основные действия в коде сводятся к проверке координат курсора мышки в соответствии с содержимым поля.

Работа с сокетами

Наше приложение будет общаться с Сетью через класс CSocket. Сам класс CSocket основывается на своем родителе CAsyncSocket. А это значит, что CSocket является сокетом асинхронным. Что же такое асинхронный сокет? Это такой сокет, который не висит в цикле в ожидании прихода нового соединения или новых данных, как это делают синхронные сокеты, а просто вызывает определенное событие, если что-то произошло. Событием в данном случае является новое соединение, пришедшие или ушедшие данные и т.п.

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

Теперь добавим этот класс в нашу программу. Нам придется создать два новых класса на основе CSocket. Первый класс CServerSocket. Он будет отвечать за входящие соединения (это тот случай, когда ты выступаешь в роли сервера). Второй, как ты, наверное, догадался, называется CClientSocket. Он используется для исходящих соединения к серверу.

На самом деле, второй класс CClientSocket используется первым CServerSocket. Когда ловится новое входящее соединение, вызывается функция Accept. После чего образуется новый объект на основе CClientSocket. И дальше с этим объектом можно работать как с обычным сокетом, т.е. отсылать или принимать данные.

Давай теперь посмотрим, как же объявляется класс CServerSocket. Для начала добавь его при помощи Class View. Кликни правой кнопкой на своем проекте, выбери пункт Add -> Add Class. В появившемся меню отметь, что у тебя MFC Class, и жми на кнопку Open. В следующем меню в поле Base class найди класс CSocket. А в строке Class name пропиши имя класса: CServerSocket. Все, дави на Finish. Будут созданы два новых файла: ServerSocket.cpp и ServerSocket.h.

Класс добавлен, осталось только произвести с ним некоторые корректировки. Во-первых, тебе надо добавить ссылку на наше диалоговое окно. Это необходимо, чтобы приложение смогло нормально общаться с серверным сокетом. В общем, открывай файл ServerSocket.h и добавляй в public ссылку на класс CxoDlg (это наше с тобой диалоговое окно, где происходят все действия):

public:

CxoDlg* m_pDlg;

Теперь немного поменяй сам конструктор класса. У тебя он должен получиться вот таким:

CServerSocket(CxoDlg* pDlg);

На этом в хедерным файле изменения закончены. Будем корректировать ServerSocket.cpp. Открывай его и найди в нем конструктор класса. Приведи его к следующему виду:

Назад на стр. 061-090-1  Содержание  Вперед на стр. 061-090-3