版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、计算机网络课程设计报告网络连天程序的设计与实现姓 名:坚学 号:0855010206班 级: 计算机002 指导老师:文宏科技大学计算机科学与工程学院2011年9月一、课程设计题目利用WindowsSocket编程实现局域网的聊天程序,要求能实现消 息的发送和接收,以及聊天软件的细节问题。二、题目分析拿到题目之后先来了解windows socket连接的过程与相关的API 函数。按照题目的要求,我简单的分析了下并做了初步的设计:利用 tcp协议建立连接,这样服务器和客户端分离,服务端先启动并监听 端口,客户端启动之后连接服务端建立连接,接着收发聊天信息。当 任意一方连接断开的时候给出适当的提示
2、并结束程序。因为功能比较简单,所以设计起来还是比较容易的。实际的操作 中我遇到了很多新奇的问题并通过一些方案修改或者实现了最终的 功能。三、设计步骤1、熟悉网络编程概念以及一些基本知识2、在windows的编程环境下熟悉了常用 socket函数3、先整体再局部顺序设计程序4、调试并修改程序,使之实现设计要求5、测试程序,从中找出程序缺陷和可改进容6、重复修改和测试,以达到自己理想的功能7、程序评定测试8撰写设计报告四、设计过程第一个版本并未实现收发同步,只是简单的阻塞式通信。因为没 有用到多线程,所以在程序监听网络数据写入时不能监听键盘输入, 所以只能发一条后接一条,其中的问题可想而知。第二个
3、版本用多线程实现了同时收发问题,在连接建立后新建一 个线程用来等待键盘输入,而主体线程等待网络输入,当网络输入错 误时(连接断开),结束线程并作下一步处理。这个版本就上个版本 改进很多,主要可以即时在屏幕输出接收到的消息, 同时也出现了另 外一个缺陷:当键盘输入到一半时程序收到了网络的信息, 这个时候 程序的做法是直接输出这条信息,这导致我们键盘输入的信息被切 断,很不人性化。第三个版本,也就是目前评测的版本,这个版本利用临界值来锁定屏幕资源,让程序在同一时刻只能一个程序拥有屏幕控制权,这样保证了不会交叉显示。另外我用自己的输入输出代替了原有的sea nf和printf,这样使读写更安全可靠。
4、同时改进的还有等待机制,在 服务器启动之后立即监听本机 6000端口,建立连接之后直接开辟线 程等待输入。而客户端启动时要输入目的机的ip地址,连接完成时打印欢迎信息并开始进入聊天。聊天结束(断开)之后可以重新输入目 的机器ip地址以建立新连接。五、调用顺序图六、源代码1、 共有文件soc.h(调试用文件)#in elude <time.h>void getime(char *s_tim)time_t rawtime;struct tm * timei nfo;time ( & rawtime );timei nfo = localtime (&rawtime );
5、spri ntf(s_tim,"%02d:%02d:%02d",timei nfo->tm_hour,timei nfo->tm_mi n, timei nfo- >tm_sec);return ;2、服务端 server.cpp#i nclude <stdio.h>#i nclude <Win sock2.h>#in clude <win dows.h>#in clude <coni o.h>#in clude "socs.h"#pragma comment(lib,"ws2_
6、32.lib")DWORD WINAPI gotsListe n(LPVOID);DWORD WINAPI setsListe n(LPVOID);void geta(char *s);void puta(char*,i nt);void getime(char *);CRITICAL_SECTION g_cs;CRITICAL_SECTION t_cs;char bufer1OOO;int bufle n;bool li nked;void mai n(void)HANDLE gotHa ndle;HANDLE setHa ndle;WORD wVerR;WSADATA wsD;w
7、VerR=MAKEWORD(1,1);if(WSAStartup(wVerR,& wsD) return ;if(LOBYTE(wsD.wVersio n)!=1|HIBYTE(wsD.wVersio n) !=1)WSAClea nup(); return ;SOCKET scSr=socket(AF_INET,SOCK_STREAM,0);SOCKADDR_IN adrSr;adrSr.sin_port=hto ns(6000);bin d(scSr,(SOCKADDR *)&adrSr,sizeof(SOCKADDR);liste n(scSr,5);SOCKADDR_I
8、N adrCl;int len=sizeof(SOCKADDR);while(true)prin tf("bi nd%d success!n",6000);SOCKET scCo n=accept(scSr,(SOCKADDR *)&adrCI, &len);char s_adr100;strcpy(s_adr,i net_n toa(adrCl.s in _addr);lin ked=true;prin tf("li nk%s be created!n",s_adr);In itializeCriticalSecti on(&t
9、_cs);gotHa ndle=CreateThread(NULL,O, &gotsListe n,& scCo n,0,NULL);setHa ndle=CreateThread(NULL,O, &setsListe n,& scCo n,0,NULL); while(li nked)Sleep(10);Termi nateThread(setHa ndle,NULL);CloseHa ndle(gotHa ndle);CloseHa ndle(setHa ndle);DeleteCriticalSecti on(&t_cs);closesocket(
10、scC on);prin tf("nlin k%s closed!n",s_adr);closesocket(scSr);return ;DWORD WINAPI gotsListe n(LPVOID lpParam)char gots1000;while(li nked)/En terCriticalSectio n(&g_cs);if(recv(*(SOCKET *)lpParam,gots,1000,0)=-1)break;/LeaveCriticalSecti on(&g_cs);puta(gots,1);lin ked=false;return 0
11、;DWORD WINAPI setsListe n(LPVOID lpParam)while(li nked)geta(bufer);/En terCriticalSectio n(&g_cs);se nd(*(SOCKET *)lpParam,bufer,strle n(bufer)+1,0);/LeaveCriticalSecti on(&g_cs);puta(bufer,O);ExitThread(NULL);return 0;void puta(char *s,i nt sta)int i=1;char s_tim16;getime(s_tim);switch(sta)
12、case 0:En terCriticalSectio n(&t_cs); while(i-) prin tf("b b");printf("local %sn %sn",s_tim,s);LeaveCriticalSect ion(& t_cs); break;case 1:En terCriticalSectio n(&t_cs); i+=bufle n;while(i-)prin tf("b b");printf("NET %sn %sn",s_tim,s); prin tf(&quo
13、t;>%s",bufer);LeaveCriticalSect ion(& t_cs); break;void geta(char *s)char c;En terCriticalSecti on(&t_cs);prin tf(">");buferbufle n=0='0'LeaveCriticalSecti on(&t_cs); while(c=getch()if(c>31 &&c<127)En terCriticalSecti on(&t_cs); sbufle n+=c;
14、sbufle n='0'prin tf("%c",c);LeaveCriticalSecti on(&t_cs);elseswitch(c)case 13:En terCriticalSecti on(&t_cs); while(bufle n-)prin tf("b b");LeaveCriticalSecti on(&t_cs); return;case 8:En terCriticalSecti on(&t_cs); if(bufle n) bufle n-;prin tf("b b&quo
15、t;); sbufle n='0:LeaveCriticalSecti on(&t_cs); break;3、客户端 client.cpp#i nclude <stdio.h>#i nclude <Win sock2.h>#in clude <win dows.h>#in clude <coni o.h>#in clude "socs.h"#pragma comme nt(lib,"ws2_32.lib")DWORD WINAPI gotsListe n(LPVOID);DWORD WINA
16、PI setsListe n(LPVOID);void geta(char *);void puta(char*,i nt);void getime(char *);CRITICAL_SECTION t_cs;char bufer1OOO;int bufle n;bool li nked;void mai n(void)HANDLE gotHa ndle;HANDLE setHa ndle;char s_adr10;WSADATA wsD;if(WSAStartup(MAKEWORD(1,1),&wsD)return ;if(wsD.wVersio n!=MAKEW0RD(1,1)WS
17、AClea nup();return;SOCKET scSr=socket(AF_INET,SOCK_STREAM,0);while(true)prin tf("Ready to Conn ect:");scan f("%s",s_adr);SOCKADDR_IN adrSr;adrSr.s in _addr.S_ un. S_addr= in et_addr(s_adr);adrSr.sin_family=AF_INET;adrSr.sin_port=hto ns(6000);lin ked=!co nn ect(scSr,(SOCKADDR *)&a
18、mp;adrSr,sizeof(SOCKADDR); if(li nked)prin tf("li nk%s created success!n",s_adr);In itializeCriticalSect ion(& t_cs);gotHa ndle=CreateThread(NULL,O, &gotsListe n,& scSr,O,NULL); setHa ndle=CreateThread(NULL,O, &setsListe n,& scSr,0,NULL); while(li nked)Sleep(10);Termi n
19、ateThread(setHa ndle,NULL);Termi nateThread(gotHa ndle,NULL);CloseHa ndle(gotHa ndle);CloseHa ndle(setHa ndle);DeleteCriticalSectio n(& t_cs);elseprin tf("Failed to connect %s,check it and try aga in !n",s_adr);closesocket(scSr);prin tf("nlin k%s be closed!n",s_adr);return ;D
20、WORD WINAPI gotsListe n(LPVOID lpParam)char gots10000;while(li nked)/puts("r unnin g");/En terCriticalSectio n(&g_cs);if(recv(*(SOCKET *)lpParam,gots,1000,0)=-1)break;/LeaveCriticalSecti on(&g_cs);puta(gots,1);lin ked=false;ExitThread(NULL);return 0;DWORD WINAPI setsListe n(LPVOID
21、lpParam)while(li nked)geta(bufer);/En terCriticalSectio n(&g_cs);se nd(*(SOCKET *)lpParam,bufer,strle n(bufer)+1,0);/LeaveCriticalSecti on(&g_cs);puta(bufer,0);ExitThread(NULL);return 0;void puta(char *s,i nt sta)int i=2;char s_tim16;getime(s_tim);switch(sta)case 0:En terCriticalSectio n(&am
22、p;t_cs);while(i-)prin tf("b b");prin tf("local %sn %sn", s_tim,s);LeaveCriticalSect ion(& t_cs);break;case 1:En terCriticalSectio n(&t_cs); i+=bufle n;while(i-)prin tf("b b");printf("NET %sn %sn",s_tim,s);prin tf(">%s",bufer); LeaveCritica
23、lSect ion(& t_cs);break;void geta(char *s)char c;En terCriticalSecti on(&t_cs);prin tf(">");buferbufle n=0='0:LeaveCriticalSecti on(&t_cs); while(c=getch()if(c>31 &&c<127)En terCriticalSecti on(&t_cs); sbufle n+=c;sbufle n='0'prin tf("%c&qu
24、ot;,c); LeaveCriticalSecti on(&t_cs);elseswitch(c)case 13:En terCriticalSecti on(&t_cs); while(bufle n-)prin tf("b b");LeaveCriticalSecti on(&t_cs); return;case 8:En terCriticalSecti on(&t_cs); if(bufle n) bufle n-;prin tf("b b"); sbufle n='0'LeaveCritical
25、Secti on(&t_cs); break;七、调试运行本实例在同一 ip和不同分别做了测试,运行状况达到了预期的效果,F面是相关的几运行截图:服务器以及客户端启动的画面D:foind60B0 successg D:DebugClient _ esceAdp to Connect112710?0.建立连接之后提示信息以及叩令提示符D;DbugServEr. exeplritlE&00Bl sue匚 llinkC127-0-S.,lJ be ci'eatedfu、D: DebugClient_ esteReady to Conn&ct0_9_1客户端向服务器发送
26、信息F面来做一系列的测试查看程序防交叉输出的功能:1、连接之后服务端在写一些容D:DebugServer-exe:12:10le L1d* nice t neet you!>do yo* knoif Jwck? He is so badf and2、客户端发送了一条消息,服务端将消息插入,并继续等待输入端输入曲 D-DebugA5eTver.ezepind6000 Euccess!l±nk127.0he created? HET 05:12:10i liellofnice to neet;IHETJ 95=22=10I love Juck very nuchl do you Jehqv he? >do vou know Jud? He is so bad! and3、服务器继续编辑文本并发
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《GBT 18650-2008地理标志产品 龙井茶》专题研究报告
- 慢性病防控中的健康管理路径优化
- 慢性病康复的健康素养干预方案
- 军队安全教育课件
- 慢性病健康传播的循证实践与案例分析
- 慢性气道疾病多重用药的药师干预策略
- 公司和股东分红协议书
- 慢性心衰患者运动康复方案优化
- 军事安全培训学习课件
- 慢性伤口愈合中纳米药物靶向递送策略
- 2025年大学《电子商务概论》期末试题及答案
- 2025呼和浩特市文化旅游投资集团有限公司招聘工作人员(职能类)20人考试参考题库及答案解析
- 后勤洗刷合同协议
- 2026年海南职业技术学院单招职业技能测试题库及参考答案详解1套
- 运动员退役协议书
- 生命伦理学:生命医学科技与伦理智慧树知到期末考试答案章节答案2024年山东大学
- JJG 4-2015钢卷尺行业标准
- 全球胜任力英语教程 课件 Unit 2 saying no to poverty
- 个人投资收款收据
- GB/T 7044-2013色素炭黑
- T∕CCCMHPIE 1.44-2018 植物提取物 淫羊藿提取物
评论
0/150
提交评论