Создание программы обмена текстовыми сообщениями через локальную сеть
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
?ст устройства для рисования(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0);
// выравнивание значка по центру клиентского прямоугольникаcxIcon = GetSystemMetrics(SM_CXICON);cyIcon = GetSystemMetrics(SM_CYICON);rect;(&rect);x = (rect.Width() - cxIcon + 1) / 2;y = (rect.Height() - cyIcon + 1) / 2;.DrawIcon(x, y, m_hIcon);
}
{::OnPaint();
}
}
// вызов данной функции системой при перетаскивании окнаCChatCppDlg::OnQueryDragIcon()
{static_cast(m_hIcon);
}
// Запускаем серверCChatCppDlg::OnBnClickedRadioServer()
{
// Проверки несанкционированного запуска сервера:
// Если кнопка не в состоянии нажатой,
// если сокет в работе (т.е. только с нулевым сокетом можно начинать работать),
// очень неудобно если в чате все будут под одинаковыми именами.(m_ButtonStartServer.GetCheck() != BST_CHECKED) return;(m_mainSocket.m_hSocket != INVALID_SOCKET) return;(QueryName() == false)
{("Введите свое имя для чата!");();;
}strPort;_wndPort.GetWindowText(strPort);
// Класс CAsyncSocket упрощает процедуру создания сокета,
// вкладывая в функцию Create() непосредственное создание
// сокета и связывание его с одним из IP адресом доступном на компьютере.
// atoi конвертирует строку ansi to int(m_mainSocket.Create(atoi(strPort)) == FALSE)
{("Ошибка создания сервера!\nВозможно данный порт уже используется!");();
}
{
// Вводим сокет в режим прослушивания запросов на подключения.(m_mainSocket.Listen() == FALSE)
{();
}
{
// Если все в порядке.(true);("Сервер ждет подключения!");
// В чате только сервер._wndCountPeople.SetWindowText("В чате 1 чел. online");
}
}
}
// Запускаем клиентаCChatCppDlg::OnBnClickedRadioClient()
{
// Контроль несанкционированного запуска клиента:
// Если кнопка не в состоянии нажатой,
// если сокет в работе (т.е. только с нулевым сокетом можно начинать работать),
// очень неудобно если в чате все будут под одинаковыми именами..(m_ButtonStartClient.GetCheck() != BST_CHECKED) return;(m_mainSocket.m_hSocket != INVALID_SOCKET) return;(QueryName() == false)
{("Введите свое имя для чата!");();;
}
// Класс CAsyncSocket упрощает процедуру создания сокета,
// вкладывая в функцию Create() непосредственное создание
// сокета и связывание его с одним из IP адресом доступном на компьютере.(m_mainSocket.Create() == TRUE)
{strAddress;_wndIPAddress.GetWindowText(strAddress);strPort;_wndPort.GetWindowText(strPort);(m_mainSocket.Connect(strAddress, atoi(strPort)) == FALSE)
{
// В ассинхронном режиме код этой ошибки
// считается как ожидание события подключения,
// т.е. практически успешный возврат.(GetLastError() == WSAEWOULDBLOCK)
{(false);
}
{
// иначе при возникновения какой либо ошибки останавливаем чат();
}
}
}
}
// Нажали кнопку "Выйти из чата".CChatCppDlg::OnBnClickedButtonStopchat()
{();
}
// Запрещает доступ к управлениям при работе
// приложения в режиме сервера или клиента.
// Цель запрета - избежать исключения от
// случайного нажатия "неправильных" кнопок.CChatCppDlg::DisabledControl(bool server)
{
// Запреты._wndIPAddress.EnableWindow(FALSE);_wndPort.EnableWindow(FALSE);_ButtonSend.EnableWindow(FALSE);(server == true)
{_ButtonStopChat.SetWindowText(g_strStopChat);_ButtonStartClient.EnableWindow(FALSE);
}
{_ButtonStopChat.SetWindowText(g_strExitFromChat);_ButtonStartServer.EnableWindow(FALSE);
}
// Разрешения.
// Разрешить возможность выхода из чата._ButtonStopChat.EnableWindow(TRUE);
}
// Разрешить доступ к управлениям после закрытия сокетов.
// Цель запрета - избежать исключения от
// случайного нажатия "неправильных" кнопок.CChatCppDlg::EnabledControl(void)
{
// Разрешения._wndIPAddress.EnableWindow(TRUE);_wndPort.EnableWindow(TRUE);_ButtonStartClient.EnableWindow(TRUE);_ButtonStartServer.EnableWindow(TRUE);
// Запреты._ButtonStopChat.EnableWindow(FALSE);_ButtonSend.EnableWindow(FALSE);
}
// Принимаем запросы на подключенияCChatCppDlg::OnAccept(void)
{* pSock = new CSock;>m_pParent = this;
// Если все в порядке добавим рабочий сокет в список
// подключенных рабочих сокетов.(m_mainSocket.Accept(*pSock) == TRUE)
{_vecSockets.push_back(pSock);_ButtonSend.EnableWindow(TRUE);();
}pSock;("Сеть работает!");
}
// Выход из чата,
// если это сработало на стороне сервера,
// то это полная остановка чата.CChatCppDlg::StopChat(void)
{
// Отсылаем сигнал об отключении от чата.();_mainSocket.Close();(int i = 0; i < (int)m_vecSockets.size(); i++)
{_vecSockets[i]->Close();m_vecSockets[i];
}
// Очистим вектор от ненужных элементов._vecSockets.clear();_ButtonStartServer.SetCheck(BST_UNCHECKED);_ButtonStartClient.SetCheck(BST_UNCHECKED);
// Разрешим доступ к управлению для
// повторных попыток.();
// В чате нет никого._wndCountPeople.SetWindowText("В чате 0 чел.");("Нет сети!");
}
// Отправка подготовленного сообщения.CChatCppDlg::OnBnClickedButtonSend()
{strChat;_wndSend.GetWindowText(strChat);(strChat);
}
// Извлечение сообщений из сети чата.CChatCppDlg::OnReceive(void)
{sb;(m_ButtonStartServer.GetCheck() == BST_CHECKED)
{
// Сервер несет большую нагрузку при получении сообщений.(int index = 0; index < (int)m_vecSockets.size(); index++)
{_vecSockets[index]->Receive(&sb, sizeof(SENDBUFFER));
// Если кто-то отключился, удаляем этого клиента
// из списка доступных клиентов.(sb.typemessage == m_TypeMessage::tmDisconnect)
{_vecSockets[index]->Close();m_vecSockets[index];_vecSockets.erase(m_vecSockets.begin() + index);();
// Отсылка принятого севером сообщения в сеть другим клиентам,
// как зеркало, клиент может работать с другими клиентами в
// сети только через сервер.(sb, false);;
}
// Рассылаем сообщения клиента по сети чата.(sb.typemessage == m_TypeMessage::tmChat)
{(sb, false);;
}
}
}if(m_ButtonStartClient.GetCheck() == BST_CHECKED)
{_mainSocket.Receive(&sb, sizeof(SENDBUFFER));
}
// Обработка принятого сообщения на основе
// его типа.(sb.typemessage)
{m_TypeMessage::tmCountPeople:
{_wndCountPeople.SetWindowText("В чате " +(sb.countpeople) + " чел. online");
};m_TypeMessage::tmChat:
{strChat;_wndChat.GetWindowText(strChat);+= " " + CString(sb.name) + ": " + CString(sb.buffer) + " ("+ IntToStr(sb.d)+ ":"+ IntToStr(sb.e)+":"+ IntToStr(sb.f)+ "-"+IntToStr(sb.a)+":"+ IntToStr(sb.b)+":" + IntToStr(sb.c)+")"+ "\r\n";_wndChat.SetWindowText(strChat);number_line = m_wndChat.GetLineCount();_wndChat.LineScroll(number_line);
};m_TypeMessage::tmDisconnect:
{strChat;_wndChat.GetWindowText(strChat);
// Если принято сообщение об остановки чата(отключении сервера),
// изменим содержимое сообщения.(sb.stopchat == true)