Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 августа!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Слушай, дружище, зачем так мучиться с этим языком С++, ты ведь не Билл Гейтс. Возьми тот же Python и программируй, он кроссплатформенный, под Windows тоже работает. Я сам давно заметил: то что на Си пишешь в страницу кода, на питоне решается в одну-две строки. При том, питон намного проще, я его сам недавно изучил по видеокурсу вот этому. Кстати, автор отлично там объясняет. Буквально день-два и уже будешь писать на нём, чего не скажешь про сложный С++.
Сетевая работа в Visual C++ , класс CSocket.
           Данная статья  не раскрывает никаких особых трюков при
программировании сетевых приложений, здесь приведен самый простой пример
клиент -сервер взаимодействия.
    В данном примере создаются два приложения одно будет сервером другое
клиентом. С сервера можно посылать тестовые сообщения клиенту.

Создание приложения сервера.
                При создании нового проекта выбираем что это будет  MFC AppWizard(exe)
и называться он будет server. Выбираем что это Dialog Based приложение, в
следующем окне ставим галочку подтверждения использования Windows Socket.
И далее жмем Next> до упора. Открываем поле редактирования диалога и добиваемся
приблизительно такого произведения искусства.

        Далее надо в КлассВизарде создать переменную для  EditBoxa

Обратите внимание на то что две переменные можно создать....одну класса CString......так вот она
нам НЕ нужна.......надо нам переменная класса CEdit.

Далее редактируем код для каждой из кнопок диалога:
* Дважды щелкаем по кнопке Connect и пишем следующий текст

void CServerDlg::OnOK()
{
 // TODO: Add extra validation here
 AfxSocketInit(); // Иннициализация системы сокетов
 CSocket MySocket; //создаем класс сокета сервера
 if(!MySocket.Create(22222)) MessageBox("Не могу создать сокет сервера","",MB_OK);
// вызываем функцию создания и иннициализации сокета
 MySocket.Listen(); // слушаем запросы от клиентов
    MySocket.Accept(SendSocket); // принимает запрос на соединение
// переменная SendSocket определена как клас  CSocket
// в секции глобальных переменных . эта переменная
// просто объявляется...никаких других операций с ней
// заранее не проводится.
 MessageBox("Готов к передаче","",MB_OK);
// сообщаем о готовности обмена данными

 }

* Дважды щелкаем по кнопке Quit и пишем следующий текст

void CServerDlg::OnCancel()
{
 // TODO: Add extra cleanup here
 SendSocket.Close(); // Закрываем сокет
 CDialog::OnCancel();// Закрывем программу
}

* Дважды щелкаем по кнопке  <<Send и пишем следующий текст

void CServerDlg::OnButton1()
{
 // TODO: Add your control notification handler code here

 int BuffLenght = m_edit1.LineLength();
// Вычисляем длину сообщения
 SendSocket.Send(&BuffLenght,4);
// Посылаем клиенту длинну сообщения.
 char* Buffer = new char[BuffLenght];
// подготавливаем буффер для введенного текста
 m_edit1.GetLine(0,Buffer,BuffLenght);
//записываем введенную строку в буфер
 SendSocket.Send(Buffer,BuffLenght);
//посылаем строку клиенту......ап...:-))
 delete Buffer;
//удаляем буфер
}

Сервер готов.
 

Создание приложения клиента.
                При создании нового проекта выбираем что это будет  MFC AppWizard(exe)
и называться он будет klient. Выбираем что это Dialog Based приложение, в
следующем окне ставим галочку подтверждения использования Windows Socket.
И далее жмем Next> до упора. Открываем поле редактирования диалога и добиваемся
приблизительно такого-же  произведения искусства как и в случае  с сервером.

с подготовительной работой у клиента слегка сложновато......необходимо создать
класс основанный на CSocket....для этого щелкаем другой кнопкой мыши и в
полученном меню выбираем New Class...


Получаем следующую картинку...


Называем создаваемый класс MySocket и задаем что базовым для него
будет класс CSocket.

теперь создаем карту обработки сообщений. Конкретно нас интересует задать
(перегрузить) обработчик функции OnReceive которая автоматом выполняется
когда на сокет приходят данные. Дважды щелкнув по OnReceive в нижнем окошке
перейдем к редактированию кода этой функции.

void MySocket::OnReceive(int nErrorCode)
{
 // TODO: Add your specialized code here and/or call the base class

 int BufferLenght=10;
// переменная длины буфера должна быть проинициализирована
 Receive(&BufferLenght,4);
//принимаем длину следующего пакета
 char* Buffer = new char[BufferLenght+1];
//выделяем память под буфер в который щас будем принимать
// пакет (сообщение)
 Buffer[BufferLenght]=0;
// записываем 0 в конец строки, чтоб получился ASCIIZ формат.
 Receive(Buffer,BufferLenght);
//принимаем строку.....
 MessageBox(NULL,Buffer,"",MB_OK);  // выводим месаджбокс
 delete Buffer;
//освобождаем память
  CSocket::OnReceive(nErrorCode);
// так надо по описанию функции
}

Переходим к редактированию кода кнопок диалога
* Дважды щелкаем по кнопке Connect и пишем следующий текст

// переменная MySocket1 определена в секции глобальных переменных
//объявление имеет вид MySocket MySocket1;

void CKlientDlg::OnOK()
{
 // TODO: Add extra validation here
 if(!MySocket1.Create())
      {MessageBox("Не могу создать сокет","",MB_OK);}
// создание сокета.....
 if(!MySocket1.Connect("192.168.0.2",22222))
      {MessageBox("Не могу создать соединение","",MB_OK);}
//подсоединение к серверу. важно действительно
// указать АйПи адресс сервера и правильный порт.....
}

* Дважды щелкаем по кнопке Quit и пишем следующий текст
void CKlientDlg::OnCancel()
{
 // TODO: Add extra cleanup here
 MySocket1.Close(); // Закрываем сокет
 CDialog::OnCancel(); // Закрывем программу
}

* Дважды щелкаем по кнопке GetMessage и пишем следующий текст
void CKlientDlg::OnButton1()
{
 // TODO: Add your control notification handler code here
// полностью то же самое что и в функции OnReceive
 int BufferLenght=10;
 MySocket1.Receive(&BufferLenght,4);
 char* Buffer = new char[BufferLenght+1];
 Buffer[BufferLenght]=0;
 MySocket1.Receive(Buffer,BufferLenght);
 MessageBox(Buffer,"",MB_OK);
 delete Buffer;
}

Результат работы программы.

Запускаем приложения сервер и клиент.....на сервере нажимаем Connect (1) потом на клиенте
нажимаем Connect (2) после этого в окне сервера набираем текст......(3) и нажимаем
кнопычку <<Send......Клиент генерирует вот такое окошко.....

Если потом еще раз нажать Connect либо там либо там вывалится в ошибку.....

Вместо заключения.
* Вот собственно и все, здесь приведены только концепции реализации
клиент - серверных приложений Windows - остальная работа за   ВАМИ.
Обязательно  посмотрите описания для всех используемых здесь функций.

Пример можно скачать и посмотреть здесь, однако предупреждаю
что особых функций обработки ошибок в примерах нет... (на то он и пример)
Вопросы, просьбы и пожелания отправляйте по адрессу kozloff@dviyka.odessa.net
С ув. и пожеланием успехов Денис Козлов.
 
 
 

<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS