《计算机网络》课程设计报告

2026/4/24 10:12:44

xxxxxxxxxxx实验用纸

ON_BN_CLICKED(IDC_BN_CLOSE, OnBnClose) ON_MESSAGE(WM_RECEIVE, OnReceive) ON_MESSAGE(WM_CLIENTCLOSE, OnClientClose) ON_MESSAGE(WM_ACCEPT, OnAccept) ON_WM_DESTROY() END_MESSAGE_MAP()

///////////////////////////////////////////////////////////////////////////// // CServerDlg message handlers BOOL CServerDlg::OnInitDialog() { CDialog::OnInitDialog(); ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon m_iNetPort = 3127; m_Server.Initialize(this); m_bServer = FALSE; GetDlgItem(IDC_BN_CLOSE)->EnableWindow(FALSE); return TRUE; // return TRUE unless you set the focus to a control }

void CServerDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } }

void CServerDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

第 9 页 共 26 页

xxxxxxxxxxx实验用纸

int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } }

HCURSOR CServerDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; }

void CServerDlg::OnBnStart() { // 创建套接字 m_Server.Create(m_iNetPort); // 开始监听 m_Server.Listen(); // 显示 CString strInfo; strInfo.LoadString(IDS_CREATE_SERVER); ShowInDisplay(strInfo); m_bServer = TRUE; GetDlgItem(IDC_BN_START)->EnableWindow(FALSE); GetDlgItem(IDC_BN_CLOSE)->EnableWindow(TRUE); }

void CServerDlg::OnBnClose() { CloseServer(); GetDlgItem(IDC_BN_START)->EnableWindow(TRUE); GetDlgItem(IDC_BN_CLOSE)->EnableWindow(FALSE); }

void CServerDlg::OnAccept() { // 创建新客户 CMySocket *pNewClient = new CMySocket; pNewClient->Initialize(this); m_Server.Accept(*pNewClient); // 放入链表中 m_lsClient.AddTail(pNewClient); }

void CServerDlg::OnClientClose(WPARAM wParam, LPARAM lParam) { CMySocket *p_delClient = (CMySocket*)wParam; // 关闭该用户 p_delClient->ShutDown();

第 10 页 共 26 页

xxxxxxxxxxx实验用纸

char buffer[BUFFERSIZE]; while(p_delClient->Receive(buffer, BUFFERSIZE)>0); p_delClient->Close(); // 在用户链表中删除该用户 POSITION psCur, psList = m_lsClient.GetHeadPosition(); CMySocket *p_curClient; while(psList!=NULL) { psCur = psList; p_curClient = (CMySocket *)m_lsClient.GetNext(psList); if(p_delClient==p_curClient) { m_lsClient.RemoveAt(psCur); break; } } // 发送信息告诉其他用户该客户退出 CString strMsg; strMsg.LoadString(IDS_CLIENT_CLOSE); NETMESSAGE netMessage(PTC_CLIENT_QUIT, p_delClient->GetName(), p_delClient->GetName() + strMsg); SendToAllClient(netMessage); // 界面上清理该用户信息 m_lbUser.DeleteString(m_lbUser.FindString(-1, p_delClient->GetName())); ShowInDisplay(p_delClient->GetName() + strMsg); // 删除该用户 delete p_delClient; }

void CServerDlg::OnReceive(WPARAM wParam, LPARAM lParam) { CMySocket *p_curClient = (CMySocket*)wParam; NETMESSAGE netMessage; p_curClient->Receive((char *)&netMessage, sizeof(netMessage)); switch(netMessage.type) { case PTC_NEW: // 新客户加入 NewClientAdd(p_curClient, &netMessage); break; case PTC_SAY: // 普通聊天 ShowMessage(netMessage); break; } // 把加工过的信息发送给其他用户 SendToAllClient(netMessage); }

void CServerDlg::CloseServer() { if(!m_bServer) return; // 向所有客户发送服务端关闭的信息 CString strInfo;

第 11 页 共 26 页

_T(\

xxxxxxxxxxx实验用纸

strInfo.LoadString(IDS_CLOSESERVER); NETMESSAGE netMessage(PTC_SYSTEM, _T(\ SendToAllClient(netMessage); // 服务端界面显示关闭信息 ShowInDisplay(strInfo); // 关闭服务端 m_Server.Close(); // 关闭客户端 char buffer[BUFFERSIZE]; CMySocket *m_pClient; POSITION psList = m_lsClient.GetHeadPosition(); while(psList!=NULL) { m_pClient = (CMySocket *)m_lsClient.GetNext(psList); m_pClient->ShutDown(); while(m_pClient->Receive(buffer, BUFFERSIZE)>0); m_pClient->Close(); delete m_pClient; } m_lsClient.RemoveAll(); m_bServer = FALSE; }

// 向所有户发出信息

void CServerDlg::SendToAllClient(const NETMESSAGE &netMessage) { CMySocket *m_pClient; POSITION psList = m_lsClient.GetHeadPosition(); while(psList!=NULL) { m_pClient = (CMySocket *)m_lsClient.GetNext(psList); m_pClient->SendMsg(netMessage); } }

void CServerDlg::ShowInDisplay(CString str) { m_strDisplay += str + \ UpdateData(false); }

void CServerDlg::OnDestroy() { CDialog::OnDestroy(); // TODO: Add your message handler code here }

// 新用户加入

void CServerDlg::NewClientAdd(CMySocket *p_client, NETMESSAGE *netMessage) { // 存入用户名字 p_client->SetName(netMessage->form); // 在列表框中显示该用户 m_lbUser.AddString(p_client->GetName()); // 发送用户列表给该客户

第 12 页 共 26 页


《计算机网络》课程设计报告.doc 将本文的Word文档下载到电脑
搜索更多关于: 《计算机网络》课程设计报告 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219