Разработка программы для обмена тестовыми сообщениями

Автор: Пользователь скрыл имя, 11 Апреля 2011 в 17:46, курсовая работа

Описание работы

Техническое задание: разработать программу для обмена тестовыми сообщениями.
В настоящее время значительная часть программных продуктов написана на языке C++. Увеличение количества персональных ЭВМ в 80-90 гг. и вовлечение большого количества неквалифицированных пользователей в непосредственную работу на ЭВМ способствовало развитию операционных систем типа Windows. Эти операционные системы предполагают организацию процедур ввода-вывода не так как системы DOS.

Содержание

1. Введение……………………………………………………………3
2. Инструментальное обеспечение для обмена текстовыми
сообщениями……………………………………………….……...4
3. Разработка архитектуры программы для обмена текстовыми
сообщениями…………………………...........................................5
4. Программная реализация сетевой технологии обмена
текстовыми сообщениями в программе ………………………...8
5. Результаты работы программы…………………………………...25
6. Преимущества и недостатки приложения……………………….27
7. Заключение………………………………………………………...28
8. Список литературы………………………………………………..29

Работа содержит 1 файл

Курсовая СВП.doc

— 487.50 Кб (Скачать)

            GetClientRect(&rect);

            int x = (rect.Width() - cxIcon + 1) / 2;

            int y = (rect.Height() - cyIcon + 1) / 2; 

            // Draw the icon

            dc.DrawIcon(x, y, m_hIcon);

      }

      else

      {

            CDialog::OnPaint();

      }

} 
 

// The Системные вызовы эта функция, чтобы получить курсор, чтобы показать, в то время    как пользователь тянется

//  минимизировать окно.

HCURSOR CChatCppDlg::OnQueryDragIcon()

{

      return static_cast<HCURSOR>(m_hIcon);

} 

////////////////////////////////////////////// БЛОК 1////////////////////////////////////////////////////////////

// Запускаем сервер

void CChatCppDlg::OnBnClickedRadioServer()

{ 

      // Контроль несанкционированного  запуска сервера:

      // Если кнопка не  в состоянии нажатой,

      // если сокет в  работе (т.е. только с нулевым сокетом можно начинать                                                                                      работать),

      // очень неудобно  если в чате  все будут под  одинаковыми именами.

      if(m_ButtonStartServer.GetCheck() != BST_CHECKED) return; 

      if(m_mainSocket.m_hSocket != INVALID_SOCKET) return;

      if(QueryName() == false)

      {

            AfxMessageBox("ВВедите свое имя для чата!");

            StopChat();

            return;

      } 

      CString strPort;

      m_wndPort.GetWindowText(strPort);

      // Класс CAsyncSocket упрощает процедуру создания сокета,

      // вкладывая в функцию  Create() непосредственное создание

      // сокета и связывание  его с одним  из IP адресом доступном на компьютере.

      // atoi конвертирует  строку ansi to int

      if(m_mainSocket.Create(atoi(strPort)) == FALSE)

      {

            AfxMessageBox("Ошибка создания сервера!\nВозможно данный порт уже используется!");

            StopChat();

      }

      else

      {

            // Вводим сокет в  режим прослушивания  запросов на подключения.

            if(m_mainSocket.Listen() == FALSE)

            {

                  StopChat();

            }

            else

            {

                  // Если все в порядке.

                  DisabledControl(true);

                  SetWindowText("Сервер  ждет подключения!");

                  // В чате только  сервер.

                  m_wndCountPeople.SetWindowText("В чате 1 чел.");

            }

      }

}

/////////////////////////////////////////////////////////// БЛОК 1//////////////////////////////////////////////////////////////// 
 
 

/////////////////////////////////////////////////////////// БЛОК 2////////////////////////////////////////////////////////////////

// Запускаем клиента

void CChatCppDlg::OnBnClickedRadioClient()

{ 

      // Контроль несанкционированного запуска клиента:

      // Если кнопка не  в состоянии нажатой,

      // если сокет в  работе (т.е. только  с нулевым сокетом  можно начинать  работать),

      // очень неудобно  если в чате  все будут под  одинаковыми именами..

      if(m_ButtonStartClient.GetCheck() != BST_CHECKED) return;

      if(m_mainSocket.m_hSocket != INVALID_SOCKET) return;

      if(QueryName() == false)

      {

            AfxMessageBox("ВВедите свое имя для чата!");

            StopChat();

            return;

      } 
 

      // Класс CAsyncSocket упрощает процедуру создания сокета,

      // вкладывая в функцию  Create() непосредственное создание

      // сокета и связывание  его с одним  из IP адресом доступном на компьютере.

      if(m_mainSocket.Create() == TRUE)

      {

            CString strAddress;

            m_wndIPAddress.GetWindowText(strAddress);

            CString strPort;

            m_wndPort.GetWindowText(strPort);

            if(m_mainSocket.Connect(strAddress, atoi(strPort)) == FALSE)

            {

                  // В ассинхронном  режиме код этой  ошибки

                  // считается как  ожидание события  подключения,

                  // т.е. практически  успешный возврат.

                  if(GetLastError() == WSAEWOULDBLOCK)

                  {

                        DisabledControl(false);

                  }

                  else

                  {

                        // Если какая-либо  ошибка возникла,

                        // приводим приложение  в первоначальное  состояние,

                        // готовым к следующей  попытке создания  соединения.

                        StopChat();

                  }

            }

      } 

}

/////////////////////////////////////////////////////////// БЛОК 2//////////////////////////////////////////////////////////////// 
 

/////////////////////////////////////////////////////////БЛОК 1.1//////////////////////////////////////////////////////////////// 

// Нажали кнопку "Выйти из чата".

void CChatCppDlg::OnBnClickedButtonStopchat()

{

      StopChat();

} 

// Запрещает доступ  к управлениям  при работе 

// приложения в режиме  сервера или клиента.

// Цель запрета - избежать исключения  от 

// случайного нажатия "неправильных" кнопок.

void CChatCppDlg::DisabledControl(bool server)

{

      // Запреты.

      m_wndIPAddress.EnableWindow(FALSE);

      m_wndPort.EnableWindow(FALSE);

      m_ButtonSend.EnableWindow(FALSE); 

      if(server == true)

      {

            m_ButtonStopChat.SetWindowText(g_strStopChat);

            m_ButtonStartClient.EnableWindow(FALSE);

      }

      else

      {

            m_ButtonStopChat.SetWindowText(g_strExitFromChat);

            m_ButtonStartServer.EnableWindow(FALSE);

      } 

      // Разрешения.

      // Разрешить возможность  выхода из чата.

      m_ButtonStopChat.EnableWindow(TRUE);

} 

// Разрешить доступ  к управлениям  после закрытия  сокетов.

// Цель запрета - избежать исключения  от

// случайного нажатия  "неправильных" кнопок.

void CChatCppDlg::EnabledControl(void)

{

      // Разрешения.

      m_wndIPAddress.EnableWindow(TRUE);

      m_wndPort.EnableWindow(TRUE);

      m_ButtonStartClient.EnableWindow(TRUE);

      m_ButtonStartServer.EnableWindow(TRUE); 
 

      // Запреты.

      m_ButtonStopChat.EnableWindow(FALSE);

      m_ButtonSend.EnableWindow(FALSE);

}

/////////////////////////////////////////////////////////БЛОК 1.1//////////////////////////////////////////////////////////////// 

/////////////////////////////////////////////////////////БЛОК 1.2////////////////////////////////////////////////////////////////

// Принимаем запросы  на подключения

void CChatCppDlg::OnAccept(void)

{

      CSock* pSock = new CSock;

      pSock->m_pParent = this;

      // Если все в порядке  добавим рабочий  сокет в список 

      // подключенных рабочих  сокетов.

      if(m_mainSocket.Accept(*pSock) == TRUE)

      {

            m_vecSockets.push_back(pSock);

            m_ButtonSend.EnableWindow(TRUE);

            SendCountPeople();

      }

      else

            delete pSock; 
 

      SetWindowText("Сеть  работает!");

}

/////////////////////////////////////////////////////////БЛОК 1.2//////////////////////////////////////////////////////////////// 
 

/////////////////////////////////////////////////////////БЛОК 1.3////////////////////////////////////////////////////////////////

// Выход из чата,

// если это сработало  на стороне сервера,

// то это полная  остановка чата.

// Для более надежной  работы чата, во  всех

// приложениях должны быть запущеня дублирующие серверы...

void CChatCppDlg::StopChat(void)

{

      // Отсылаем сигнал  об отключении  от чата.

      SendDisconnect(); 

      m_mainSocket.Close();

      for(int i = 0; i < (int)m_vecSockets.size(); i++)

      {

            m_vecSockets[i]->Close();

            delete m_vecSockets[i];

      }

      // Очистим вектор  от ненужных элементов.

      m_vecSockets.clear(); 

      m_ButtonStartServer.SetCheck(BST_UNCHECKED);

      m_ButtonStartClient.SetCheck(BST_UNCHECKED); 

      // Разрешим доступ  к управлению для

      // повторных попыток.

      EnabledControl(); 

      // В чате нет никого.

      m_wndCountPeople.SetWindowText("В  чате 0 чел.");

      SetWindowText("Нет сети!");

}

/////////////////////////////////////////////////////////БЛОК 1.3//////////////////////////////////////////////////////////////// 
 
 

Информация о работе Разработка программы для обмена тестовыми сообщениями