Создание программы обмена текстовыми сообщениями через локальную сеть

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование



?ст устройства для рисования(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)