




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 湖南工业大学 课 程 设 计 资 料 袋 计算机与通信学院 学院 系 部 2011 2012 学年第 1 学期 课程名称 计算机网络原理 指导教师 李建设 职称 副教授 学生姓名 蒋政 专业班级 软件 092 学号 09408300209 题 目 基于 UDP 协议网上聊天程序 成 绩 起止日期 2011 年 11 月 24 日 2011 年 12 月 4 日 目 录 清 单 序号材 料 名 称资料数量备 注 1课程设计任务书 2课程设计说明书 3 4 5 6 2 课程设计任务书 2010 2011 学年第学年第 2 学期学期 学院 系 部 计算机与通信学院 专业 软件工程 班级 091 3 课程名称 计算机网络原理 学生姓名 蒋政 设计题目 基于 UDP 协议网上聊天程序 指导教师 李建设 完成期限 自 2011 年 11 月 24 日至 2011 年 12 月 4 日 共 2 周 内 容 及 任 务 一 设计内容 实现一简单的聊天程序实现网上聊天 包括服务器和客户端 1 支持多人聊天 2 客户端具有图形化用户界面 二 设计任务 课程设计说明书 纸质 电子版 内容包括 设计内容 系统分析 包括可行性分析 需 求分析等 及功能分析 系统设计 要求画出系统整体功能框图 流程图 并给出相应地 关键的代码且对所使用的主要数据结构进行说明等 设计总结 评价 遇到的问题 体会 建议等 使用说明等 三 设计要求 1 按功能要求开发系统 能正确运行 程序代码书写规范 有充足的注释 2 课程设计所使用的编程语言任选 但建议使用 C 或 C 3 绿色软件 程序运行不需安装 避免写系统和注册表 起止日期工作内容 2011 11 24 2011 11 27 选题 2011 11 28 2011 11 29系统分析和设计 2011 11 30 2011 12 3熟悉软件开发工具 编码系统 系统测试 进 度 安 排 2011 12 04 2011 12 05撰写并提交课程设计说明书 含电子文档 源程序等 主 要 参 考 资 料 1 美 Larry Peterson 著 薛静锋等译 计算机网络 系统方法 第 4 版 机械工业出 版社 2009 2 荷 Andrew S Tanenbaum 著 潘爱民译 计算机网络 第 4 版 清华大学出版社 2004 3 谢希仁著 计算机网络 第 5 版 电子工业出版社 2008 1 4 吴功宜等著 计算机网络课程设计 机械工业出版社 2005 指导教师 签字 年 月 日 3 系 教研室 主任 签字 年 月 日 4 课程设计说明书 课程名称 课程名称 计算机网络原理 设计题目设计题目 基于 UDP 协议的聊天程序 专专 业 业 软件工程 班级 班级 092 学生姓名学生姓名 蒋政 学学 号号 09408300209 指导教师指导教师 李建设 年年 月月 日日 5 目录目录 1 课程设计具体实现过程课程设计具体实现过程 4 2 具体代码的实现具体代码的实现 8 3 注意事项注意事项 12 4 参考文献参考文献 12 一一 多线程编程聊天程序的具体实现多线程编程聊天程序的具体实现 1 创建 MFC EXE 工程 工程名为 Chat Dialog based 2 删除对话框控件 添加自己的控件 各个控件的 ID 分别为 接受文本框的 ID 为 IDC EDIT RECV 发送数据的文本框 ID 为 IDC EDIT SEND 发送按 钮的 ID 为 IDC BTN SEND 其余默认即可 3 加载套接字库 进行版本协商 MFC 环境下使用 AfxSocketInit 查看 MSDN 帮助 AfxSocketInit 加载的 1 1 版本 可以确保 Socket 库的释放 MSDN 中提到在 CWinApp InitInstance 中使用 在这里就是在这里就是 CChatAPP 类的类的 InitInstance 中调用中调用 if AfxSocketInit AfxMessageBox 加载套接字库失败 return FALSE 6 4 刚才使用了 AfxSocketInit 需要加入头文件 include 放入到 StdAfx h 的头文件中 StdAfx h 是预编译头文件 包括 MFC 工程必要的头文件 5 在 CChatDlg 类中定义一个成员函数 作为套接字初始化工作 BOOL InitSocket 同时增加一个 变量 SOCKET m socket 6 实现 InitSocket m socket socket AF INET SOCK DGRAM 0 if INVALID SOCKET m socket MessageBox 套接字创建失败 return FALSE SOCKADDR IN addrSock addrSock sin family AF INET addrSock sin port htons 1234 addrSock sin addr S un S addr inet addr 127 0 0 1 int retval retval bind m socket SOCKADDR int retv WSAGetLastError if SOCKET ERROR retval closesocket m socket MessageBox 绑定失败 return FALSE return TRUE 7 在 CChatDlg 的 OnInitDialog 的最后调用 InitSocket 8 下面编写接收端程序 1 当接受数据时如果没有数据到来 recvfrom 函数会阻塞 从而导致进程暂停 运行 所以采用线程来完成 2 创建线程后 我们需要传递两个参数 一个是套接字 一个是对话框的句柄 接受编辑框的句柄 这样可以通过套接字接受数据 传给接受编辑框 但 CreateThread 只能传递一个参数 第四个 但是个指针 7 9 在在 CChatDlg 的头文件中的头文件中 定义一个结构体定义一个结构体 struct RECVPARAM SOCKET sock HWND hwnd 注意这里的分号 10 在 CChatDlg 的 OnInitDialog 最后 即 InitSocket 后 RECVPARAM pRecvParam new RECVPARAM pRecvParam sock m socket pRecvParam hwnd m hWnd HANDLE hThread CreateThread NULL 0 RecvProc LPVOID pRecvParam 0 NULL CloseHandle hThread return TRUE 11 加入线程函数 从 MSDN 中 COPY 加入一个全局函数 有的单位要求不允许使用全局函数 那这里加给 CChatDlg 类 作为一个成员函数 DWORD WINAPI RecvProc LPVOID lpParameter 12 此时程序报错 因为要执行 RecvProc 需要 CChatDlg 的实例 不能在类中 调用 所以报错 解决方法 在 CChatDlg 头文件中 将将 RecvProc 函数定义为函数定义为 static 类型类型 13 实现线程函数 SOCKET sock RECVPARAM lpParameter sock HWND hwnd RECVPARAM lpParameter hwnd delete lpParameter SOCKADDR IN addrFrom int len sizeof SOCKADDR char recvBuf 200 char tempBuf 300 int retval while TRUE 8 retval recvfrom sock recvBuf 200 0 SOCKADDR if SOCKET ERROR retval break sprintf tempBuf s 说 s inet ntoa addrFrom sin addr recvBuf PostMessage hwnd WM RECVDATA 0 LPARAM tempBuf 发送数据发送数据 传送一个自定义消息 传给窗口传送一个自定义消息 传给窗口 return 0 14 加入消息相应机制 1 在 CChatDlg 的头文件中 定义消息值 加入 define WM RECVDATAWM USER 1 2 做一个消息相应函数原型的声明 在 CChatDlg 的头文件的下方的 protected 声明中加入 afx msg void OnRecvData WPARAM wParam LPARAM lParam 注意加入了两 个参数 因为 PostMessage 发送消息的过程中传递了参数 3 加入消息映射 注意因为 CAboutDlg 类和 CChatDlg 类在一个 CPP 文件中 所以消息映射一定要加正确了 找到 BEGIN MESSAGE MAP CChatDlg CDialog 在最后面写入 ON MESSAGE WM RECVDATA OnRecvData 第一个参数是 消息本身 WM RECVDATA 第二个参数是 消息相应函数 OnRecvData 注意后面不要加分号 4 最后是消息相应函数的实现 在 CPP 最后加入 void CChatDlg OnRecvData WPARAM wParam LPARAM lParam 15 实现刚才加入的 OnRecvData 消息相应函数 CString str char lParam CString strTemp 获取旧文本 GetDlgItemText IDC EDIT RECV strTemp 9 str r n 增加一个换行 str strTemp SetDlgItemText IDC EDIT RECV str 放到编辑框 16 双击发送按钮 系统自动生成按钮相应事件 1 首先要获取 IP 查看 MSDN 帮助 CIPAddressCtrl CIPAddressCtrl 对应的就是 IP 控件 通过一个 DWORD 类型的变量来接受 IP 地址 首先得到控件的指针 GetDlgItem IDC IPADDRESS1 强制转换为 CIPAddressCtrl 类型 最后调用 CIPAddressCtrl 下的一个函数 GetAddress 完整的程序是 DWORD dwIP CIPAddressCtrl GetDlgItem IDC IPADDRESS1 GetAddress dwIP 2 得到 IP 地址后 可以发送数据 继续在后面加入代码 SOCKADDR IN addrTo addrTo sin family AF INET addrTo sin port htons 1234 addrTo sin addr S un S addr htonl dwIP CString strSend GetDlgItemText IDC EDIT SEND strSend sendto m socket strSend strSend GetLength 1 0 SOCKADDR SetDlgItemText IDC EDIT SEND 17 此时发现 文本框并没有 换行显示选择 接收数据的文本框控件 右键选 择属性 在 Styles 中选择 Multiline 就可以了 18 为了让我们回车就发送数据 可以设置发送按钮为缺省按钮 可以右键 选择按钮属性 在在 Styles 中选择 Default button 就可以了 10 二二 具体代码的实现具体代码的实现 CPaintDC dc this device context for painting SendMessage WM ICONERASEBKGND WPARAM dc GetSafeHdc 0 Center icon in client rectangle int cxIcon GetSystemMetrics SM CXICON int cyIcon GetSystemMetrics SM CYICON CRect rect GetClientRect 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 system calls this to obtain the cursor to display while the user drags the minimized window HCURSOR CChartDlg OnQueryDragIcon return HCURSOR m hIcon BOOL CChartDlg InitSocket m socket socket AF INET SOCK DGRAM 0 if INVALID SOCKET m socket MessageBox 套接字创建失败 return FALSE 11 SOCKADDR IN addrSock addrSock sin family AF INET addrSock sin port htons 1234 addrSock sin addr S un S addr inet addr GethostIP int retval retval bind m socket SOCKADDR int retv WSAGetLastError if SOCKET ERROR retval closesocket m socket MessageBox 绑定失败 return FALSE return TRUE DWORD WINAPI CChartDlg RecvProc LPVOID lpParameter SOCKET sock RECVPARAM lpParameter sock HWND hwnd RECVPARAM lpParameter hwnd delete lpParameter SOCKADDR IN addrFrom int len sizeof SOCKADDR char recvBuf 200 char tempBuf 300 int retval while TRUE retval recvfrom sock recvBuf 200 0 SOCKADDR if SOCKET ERROR retval break sprintf tempBuf s 说 s inet ntoa addrFrom sin addr recvBuf PostMessage hwnd WM RECVDATA 0 LPARAM tempBuf 发送数据 传送一个自定义消息 传给窗口 return 0 12 void CChartDlg OnRecvData WPARAM wParam LPARAM lParam CString str char lParam CString strTemp 获取旧文本 GetDlgItemText IDC EDIT RECV strTemp if strTemp strTemp r n 增加一个换行 strTemp str SetDlgItemText IDC EDIT RECV strTemp CEdit GetDlgItem IDC EDIT RECV LineScroll CEdit GetDlgItem IDC EDIT RECV GetLineCount void CChartDlg OnButtonSend TODO Add your control notification handler code here DWORD dwIP CIPAddressCtrl GetDlgItem IDC IPADDRESS1 GetAddress dwIP SOCKADDR IN addrTo addrTo sin family AF INET addrTo sin port htons 1234 addrTo sin addr S un S addr htonl dwIP CString strSend GetDlgItemText IDC EDIT SEND strSend sendto m socket strSend strSend GetLength 1 0 SOCKADDR SetDlgItemText IDC EDIT SEND CString strTemp CString str 我说 strSend 获取旧文本 GetDlgItemText IDC EDIT RECV strTemp if strTemp strTemp r n 增加一个换行 strTemp str SetDlgItemText IDC EDIT RECV strTemp CEdit GetDlgItem IDC EDIT RECV LineScroll CEdit GetDlgItem IDC EDIT RECV GetLineCount 13 LPCSTR CChartDlg GethostIP char name 255 PHOSTENT hostinfo LPCSTR ip if get
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 药师资格考试题型及答案
- 民商银行招聘考试题库及答案
- 初一地理考试内容及答案
- 湖北春季高考试题及答案
- 难点详解人教版八年级上册物理声现象《声音的产生与传播》同步测试试卷(含答案详解版)
- 机械四级考试题库及答案
- 期中考试七上数学试卷及答案
- 全世界十级语文考试题目及答案
- 银行相关业务知识判断题及答案解析
- 2025年病案信息技术(医学高级)考试近5年真题集锦(频考类试题)带答案
- 装修公司培训的课件
- 北美压铸协会压铸标准(中文)
- 青马工程考试题库及答案
- QGDW1738-2020配电网规划设计技术导修订征求意见稿
- 2025至2030年中国汽车资讯平台行业市场现状调查及投资趋势研判报告
- 医院人事编制管理制度
- 2024世界职业院校技能大赛冠军总决赛赛项+项目讲解逐字稿
- 扎染行业现状分析报告
- 2025年家务服务员(中级)职业技能鉴定参考试题库(含答案)
- 舞蹈基本功课件
- 古籍数字化与人工智能-全面剖析
评论
0/150
提交评论