Программирование на C++ глазами хакера


Передача данных по сети с помощью CSocket - часть 3


class CClientSocket : public CSocket { public: CClientSocket(CMFCSendTextDlg* Dlg); virtual ~CClientSocket(); virtual void OnReceive(int nErrorCode); virtual void OnClose(int nErrorCode); protected: CMFCSendTextDlg* m_Dlg; };

Здесь также модифицирован конструктор, чтобы сохранять информацию о классе, создавшем класс клиента CClientSocket. Для этого заведена такая же переменная m_Dlg.

Помимо этого, введены два метода: OnReceive (вызывается, когда по сети пришли новые данные) и OnClose (вызывается, когда соединение завершено).

Теперь посмотрим, как все это реализовано в файле ClientSocket.cpp (листинг 4.9).

Листинг 4.9. Содержимое файла ClientSocket.cpp
// ClientSocket.cpp : implementation file

#include "stdafx.h" #include "MFCSendText.h" #include "ClientSocket.h"

// CClientSocket

CClientSocket::CClientSocket(CMFCSendTextDlg* Dlg) { m_Dlg = Dlg; }

CClientSocket::~CClientSocket() { }

void CClientSocket::OnReceive(int nErrorCode) { char recstr[1000]; int r=Receive(recstr,1000); recstr[r]='\0'; m_Dlg->SetDlgItemText(IDC_STATIC, recstr);

CSocket::OnReceive(nErrorCode); }

void CClientSocket::OnClose(int nErrorCode) { m_Dlg->m_SendButton.EnableWindow(FALSE);

CSocket::OnClose(nErrorCode); }

Самое важное находится в методе OnReceive. Он вызывается каждый раз, когда для клиента пришли по сети какие-то данные. Для чтения полученных данных используется метод Receive. У него два параметра:

  • буфер, в который будут записаны полученные данные, — переменная recstr;
  • размер буфера.

Метод возвращает количество полученных по сети данных. Это значение записывается в переменную r. Теперь в переменной recstr находятся полученные данные, но по правилам языка С строки должны заканчиваться нулевым символом. Добавим его в буфер за последним полученным символом:

recstr[r]='\0';

Теперь полученный текст копируем в компонент Static Text на диалоговом окне с помощью следующей строки кода:

m_Dlg->SetDlgItemText(IDC_STATIC, recstr);

Метод OnClose вызывается каждый раз, когда соединение завершено. В его коде кнопку Send Data надо сделать недоступной, потому что без соединения с сервером нельзя отправлять данные.




Начало  Назад  Вперед



Книжный магазин