Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Урок 35. Пишем клиент с использованием CSocket / Уроки MFC / Visual C++
Visual C++. MFC Урок 35. Пишем клиент с использованием CSocket
На прошлом занятии мы сделали сервер. На этом занятии мы с вами сделаем клиента. Запустите Visual C++ и создайте с помощью мастера MFC AppWizard (EXE) новое основанное на диалоге приложение. Назовите проект client. На всех шагах мастера можно почти ничего не менять - установки по умолчанию нас вполне удовлетворяют. Только обязательно установите на шаге 2 поддержку Windows Sockets. Если хотите, то можете на этом же шаге мастера убрать галочки About Box и ActiveX Controls - они нам не понадобятся.
После создания заготовки разместите на форме две кнопки и edit. Для кнопок задайте идентификаторы IDC_CONNECT и IDC_SEND. Свойство Caption для них установите в Connect и Send соответственно. По первой кнопке наш клиент будет соединяться с сервером, по второй - отправлять данные, введенные пользователем в edit. Для edit'а для определенности зададим идентификатор IDC_DATA. Наша форма будет выглядеть приблизительно так:
К edit'у припишите с помощью ClassWizard'а переменную m_sData типа CString.
Теперь приступаем непосредственно к написанию кода. Добавьте в наш проект класс CMySocket. Предком этого класса выберите класс CSocket (точно также, как и для серверной части, которой мы занимались на прошлом уроке). Внутри этого класса должен быть указатель на диалоговое окно. Для создания такого указателя добавьте соответствующую переменную в public-секцию нашего класса:
public:
CClientDlg* m_pDlg;
Так как мы используем класс CClientDlg, то добавьте строку
class CClientDlg;
перед классом CMyClient.
Как и для серверной части, добавим в класс CMySocket метод, в котором для переменной m_pDlg будет задаваться некоторое значение:
Теперь добавляем переменную в диалоговый класс CClientDlg, в которой будет храниться экземпляр класса CMySocket:
...
#include "MySocket.h"
...
class CClientDlg : public CDialog
{
public:
CMySocket m_pConnectSocket; //Передающий сокет
...
Как и для сервера, не забудьте добавить соответствующий include.
Добавьте следующий код в метод OnInitDialog класса CClientDlg:
BOOL CClientDlg::OnInitDialog()
{
...
// TODO: Add extra initialization here m_pConnectSocket.SetParentDlg(this);
m_pConnectSocket.Create();
...
}
В этом коде мы при создании диалого записываем в переменную m_pDlg класса CMySocket указатель на клиентское диалоговое окно.
Идем дальше. Добавим код, который будет выполняться при нажатии на кнопки с заголовками Connect и Send:
void CClientDlg::OnConnect()
{
// TODO: Add your control notification handler code here//Подсоединяемся к серверу
m_pConnectSocket.Connect("127.0.0.1", 2000);
}
void CClientDlg::OnSend()
{
// TODO: Add your control notification handler code here UpdateData(TRUE); //Забираем данные из edit'а
m_pConnectSocket.Send(m_sData, m_sData.GetLength()); //Пересылаем
}