C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 Сетевая работа в Visual C++ , класс CSocket / Сокеты / Сеть

Сетевая работа в 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
С ув. и пожеланием успехов Денис Козлов.