计算机网络大作业
更新时间:2024-01-18 11:15:01 阅读量: 教育文库 文档下载
计算机网络大作业
专业: 班级: 姓名: 学号:
一、介绍
该通信软件是基于C/S模式开发,是用MFC的WinSock编程原理。该应用程序的技术主要有一下几点:
1、从CAsyncSocket类派生出自己所需要的WinSock类 2、WinSock类与应用程序框架之间的关系 3、流式套接字的使用 4、网络事件
CAsyncSocket类是在很底程度上对Winsock API的封装,他提供的低级接口几乎与WinSock API的函数调用直接对应,CAsyncSocket类是从CObject类派生而来。
所谓套接字(socket)是一种网络变成接口,它是对通信短点的一种抽象,提供了一种发送和接收数据的机制。套接字是通信的基石,一个套接字是通信的一端。在通信的任何一端上,用户可以找到与套接字对应的一个套接字名字,每一个正在被使用的套接字都有它的类型和与其相关的进程。套接字存在于通信域中,通信域是为了处理一般的通过套接字通信的线程而引进的一种抽象概念。
二、整体流程图
1、启动与发送 开始启动服务器,使其处于侦听状态启动客户机,与服务器进行连接发送数据是否发送成功否提示:发送失败!是将数据显示在 发送的数据列表框中 2、接收 开始接收数据的事件被触发显示受到的数据到 接收的数据 列表框中 二、主要代码
1、创建派生的套接字类之后,向该套接字中添加一个成员变量,用作指向父对话框口德指针。
//设置CTalkDlg类的指针
void CMySocket::SetParent(CTalkDlg *pDlg) { //设置成员变量 m_pDlg=pDlg; }
2、接收、连接、关闭是近啊处理函数
//事件处理函数
void CMySocket::OnAccept(int nErrorCode) { if(nErrorCode==0) //call the dialog's OnAccept function m_pDlg->OnAccept(); }
//事件处理函数
void CMySocket::OnConnect(int nErrorCode) { if (nErrorCode==0) m_pDlg->OnConnect(); }
void CMySocket::OnRecive(int nErrorCode) { if(nErrorCode==0)
m_pDlg->OnReceive(); }
void CMySocket::OnClose(int nErrorCode) { if(nErrorCode==0) m_pDlg->OnClose(); }
3、因为对话框需要两个套接字,所以要向对话框类(CTalkDlg)中添加两个成员变量。
public:
CMySocket m_sConnectSocket; CMySocket m_sListenSocket;
4、为对话框中所有的变量添加初始化代码。
BOOL CTalkDlg::OnInitDialog() { CDialog::OnInitDialog(); // Add \ // IDM_ABOUTBOX must be in the system command range. 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);
} } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here //初始化控制变量
m_cmbType.SetCurSel(1); m_strServName=\ m_nServPort=1000; //更新控制变量 UpdateData(FALSE); //设置套接字成员的CTalkDlg类指针 m_sListenSocket.SetParent(this); m_sConnectSocket.SetParent(this); return TRUE; // return TRUE unless you set the focus to a control }
5、建立客户机与服务器之间的连接
void CTalkDlg::OnBinConnect() { // TODO: Add your control notification handler code here //从对话框中取出数据 UpdateData(TRUE); //禁用链接和类型相关控件 GetDlgItem(IDC_BIN_CONNECT)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_SERVNAME)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_SERVPORT)->EnableWindow(FALSE); GetDlgItem(IDC_STATIC_SERVNAME)->EnableWindow(FALSE); GetDlgItem(IDC_STATIC_SERVPORT)->EnableWindow(FALSE); GetDlgItem(IDC_COMBO_TYPE)->EnableWindow(FALSE); //判断当前是客户端还是服务器 if(m_cmbType.GetCurSel()==0) { //服务器 //创建用于设置端口绑定的套接字 m_sListenSocket.Create(m_nServPort); //开始侦听请求链接 m_sListenSocket.Listen(); } else { //客户机 //创建一个默认的套接字 m_sConnectSocket.Create(); //发出链接请求 m_sConnectSocket.Connect(m_strServName,m_nServPort); }
}
void CTalkDlg::OnAccept() { //此函数用于服务器 //接受链接请求 m_sListenSocket.Accept(m_sConnectSocket); //激活消息输入和发送的相关控件 GetDlgItem(IDC_EDIT_MSG)->EnableWindow(TRUE); GetDlgItem(IDOK)->EnableWindow(TRUE); GetDlgItem(IDC_STATIC_MSG)->EnableWindow(TRUE); }
void CTalkDlg::OnConnect() { //此处用于\客户机\ //激活消息输入和发送的相关控件 GetDlgItem(IDC_EDIT_MSG)->EnableWindow(TRUE); GetDlgItem(IDOK)->EnableWindow(TRUE); //botton send GetDlgItem(IDC_STATIC_MSG)->EnableWindow(TRUE); //激活\关闭\按钮,这仅对\客户机\有效 GetDlgItem(IDC_BIN_CLOSE)->EnableWindow(TRUE); }
6、发送和接收数据
void CTalkDlg::OnSendMsg() { // TODO: Add your control notification handler code here int nLen;//消息长度 int nSent;//已发送消息的长度 //从对话筐中取出数据 UpdateData(TRUE); //判断要发送的消息是否为空 if(!m_strMsg.IsEmpty()) { //获取消息的长度 nLen=m_strMsg.GetLength(); //发送消息 nSent=m_sConnectSocket.Send(LPCTSTR(m_strMsg),nLen); //判断发送是否成功 if(nSent!=SOCKET_ERROR) {
//发送成功,将消息添加到“发送的消息“列表框 m_listSent.AddString(m_strMsg); UpdateData(FALSE); } else { AfxMessageBox(\信息发送错误!\ } //清除当前消息 m_strMsg.Empty(); //更新对话框数据 UpdateData(FALSE); } }
void CTalkDlg::OnReceive() { char *pBuf=new char[1025]; int nBufSize=1024; int nReceived; CString strReceived; //接收消息 nReceived=m_sConnectSocket.Receive(pBuf,nBufSize); //判断接收是否成功 if(nReceived!=SOCKET_ERROR) { //保留接收消息的有效部分 pBuf[nReceived]=NULL; //将消息转化为CString对象 strReceived=pBuf; //将消息添加到“接收的消息”列表中 m_listReceived.AddString(strReceived); //更新对话筐数据 UpdateData(FALSE); } else { //发送消息失败,给出错误提示 AfxMessageBox(\信息接收错误!\ } }
7、终止连接
void CTalkDlg::OnClose() { //关闭连接的套接字 m_sConnectSocket.Close(); //禁用消息输入和发送的相关控件 GetDlgItem(IDC_EDIT_MSG)->EnableWindow(FALSE); GetDlgItem(IDOK)->EnableWindow(FALSE);//botton send GetDlgItem(IDC_STATIC_MSG)->EnableWindow(FALSE); GetDlgItem(IDC_BIN_CLOSE)->EnableWindow(FALSE); //清除列表框中的内容 while(m_listSent.GetCount()!=0) m_listSent.DeleteString(0); while(m_listReceived.GetCount()!=0) m_listReceived.DeleteString(0); //如果是“客户机” if(m_cmbType.GetCurSel()==1) { //对于客户机 //激活与连接相关的控件 GetDlgItem(IDC_BIN_CONNECT)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_SERVNAME)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_SERVPORT)->EnableWindow(TRUE); GetDlgItem(IDC_STATIC_SERVNAME)->EnableWindow(TRUE); GetDlgItem(IDC_STATIC_SERVPORT)->EnableWindow(TRUE); GetDlgItem(IDC_COMBO_BOX)->EnableWindow(TRUE); } }
void CTalkDlg::OnBinClose() { // TODO: Add your control notification handler code here //调用OnClose()成员函数 OnClose(); }
四、运行截图
1、启动服务器,使服务器处于侦听状态
2、启动客户机程序
此时已经连接成功
3、开始聊天
此时已经可以实现通信功能。
五、总结
通过以上学习让我学会了什么是基于C/S模式的开发,同是在调试代码的过
成中也让我深深的体会到了调试的艰苦,因为有时候一个小小的错误可以调试一个下午都找不到错误在什么地方,最后当你找到的时候你会发现那是一个小的不能再小的错误,但是这么一个错误却浪费了你一个下午的时间。所以从这个地方我可以学到在编代码的过程中一定要注意细节,一定要细心。
还有其实细节只是我学到的一小部分,最重要的是,在编写一个软件的时候的前期规划,这个非常重要,现在我深有体会,因为之前的一些软件基本上都是先从代码下手,但是这次我从规划开始,先整天想好架构,然后具体细化,最后都编代码,整个过程还不到我以前编写一个软件所用的时间的一半。
成中也让我深深的体会到了调试的艰苦,因为有时候一个小小的错误可以调试一个下午都找不到错误在什么地方,最后当你找到的时候你会发现那是一个小的不能再小的错误,但是这么一个错误却浪费了你一个下午的时间。所以从这个地方我可以学到在编代码的过程中一定要注意细节,一定要细心。
还有其实细节只是我学到的一小部分,最重要的是,在编写一个软件的时候的前期规划,这个非常重要,现在我深有体会,因为之前的一些软件基本上都是先从代码下手,但是这次我从规划开始,先整天想好架构,然后具体细化,最后都编代码,整个过程还不到我以前编写一个软件所用的时间的一半。
正在阅读:
计算机网络大作业01-18
人教版七年级上册语文-生词(拼音生字)04-30
河南省2012年普通高等学校对口招收中等职业学校毕业生考试07-22
加州大学伯克利分校与宾夕法尼亚大学哪个好04-27
不同澄清剂对五味子水提物澄清效果的比较05-15
读书心得体会:让读书伴成长 - 106-29
法学概论选择题(1)09-08
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 计算机网络
- 作业
- 布鲁纳和结构课程理论
- 卫生部医疗机构诊疗科目名录
- 2010年高考试题 - 理综(上海秋季)-复兰高考名师在线精编解析版 - 图文
- 物业管理标准化建设的意义和作用
- 安全现状评价报告 - 图文
- 浙教版数学八上1.6《尺规作图》word学案
- 交通信号灯施工方案
- 高级财务会计外币习题及答案
- 金融公司管理制度大全
- 关于夜间加班员工供应晚餐夜宵的管理办法
- 北京门头沟区地质和地形地貌 - 图文
- 诸葛武侯灵感神挂 三十二卦
- 英语听力试题模板
- 超星尔雅:专业论文写作课后作业答案+期末考试答案
- 税收筹划2014郑大在线测试题汇总
- 节日战备丝毫不能放松
- 关于征求问责办法意见的通知
- Java基础知识
- 第7章计算方法的MATLAB实现讲稿
- 三维设计在电网和变电站建设的运用