socket网络课程设计报告_第1页
socket网络课程设计报告_第2页
socket网络课程设计报告_第3页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算机网络课程设计报告网络连天程序的设计与实现姓 名:李坚学 号:_0855010206_班 级:计算机002 指导老师: 文宏湖南科技大学计算机科学与工程学院2011年9月一、课程设计题目利用 WindowsSocket 编程实现局域网的聊天程序,要求能实现消 息的发送和接收,以及聊天软件的细节问题。二、题目分析拿到题目之后先来了解 windows socket 连接的过程与相关的 API 函数。按照题目的要求,我简单的分析了下并做了初步的设计:利用 tcp 协议建立连接,这样服务器和客户端分离,服务端先启动并监听 端口,客户端启动之后连接服务端建立连接,接着收发聊天信息。当 任意一方连接断

2、开的时候给出适当的提示并结束程序。因为功能比较简单,所以设计起来还是比较容易的。实际的操作 中我遇到了很多新奇的问题并通过一些方案修改或者实现了最终的 功能。三、设计步骤1、熟悉网络编程概念以及一些基本知识2、在 windows 的编程环境下熟悉了常用 socket 函数3、先整体再局部顺序设计程序4、调试并修改程序,使之实现设计要求5、测试程序,从中找出程序缺陷和可改进内容6、重复修改和测试,以达到自己理想的功能7、程序评定测试8、撰写设计报告四、设计过程 第一个版本并未实现收发同步,只是简单的阻塞式通信。因为没 有用到多线程,所以在程序监听网络数据写入时不能监听键盘输入, 所以只能发一条后

3、接一条,其中的问题可想而知。第二个版本用多线程实现了同时收发问题,在连接建立后新建一 个线程用来等待键盘输入, 而主体线程等待网络输入, 当网络输入错 误时(连接断开),结束线程并作下一步处理。这个版本就上个版本 改进很多, 主要可以即时在屏幕输出接收到的消息, 同时也出现了另 外一个缺陷: 当键盘输入到一半时程序收到了网络的信息, 这个时候 程序的做法是直接输出这条信息,这导致我们键盘输入的信息被切 断,很不人性化。第三个版本,也就是目前评测的版本,这个版本利用临界值来锁 定屏幕资源, 让程序在同一时刻只能一个程序拥有屏幕控制权, 这样 保证了不会交叉显示。另外我用自己的输入输出代替了原有的

4、 scanf 和 printf ,这样使读写更安全可靠。同时改进的还有等待机制,在 服务器启动之后立即监听本机 6000 端口,建立连接之后直接开辟线 程等待输入。而客户端启动时要输入目的机的 ip 地址,连接完成时 打印欢迎信息并开始进入聊天。 聊天结束 (断开)之后可以重新输入目 的机器 ip 地址以建立新连接。五、调用顺序图ListenConnectRecvPrintSe nd亠kBli ndAcceptSendCloseRecvPrintClose六、源代码1、 共有文件soc.h(调试用文件)#in clude <time.h>void getime(char *s_ti

5、m)time_t rawtime;struct tm * timei nfo;time ( & rawtime );timei nfo = localtime (&rawtime );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 &l

6、t;win dows.h>#in clude <coni o.h>#in clude "socs.h"#pragma comment(lib,"ws2_32.lib")DWORD WINAPI gotsListen(LPVOID);DWORD WINAPI setsListen(LPVOID);void geta(char *s);void puta(char*,int);void getime(char *);CRITICAL_SECTION g_cs;CRITICAL_SECTION t_cs;char bufer1000;int

7、buflen;bool linked;void main(void)HANDLE gotHandle;HANDLE setHandle;WORD wVerR;WSADATA wsD;wVerR=MAKEWORD(1,1);if(WSAStartup(wVerR,&wsD)return ;if(LOBYTE(wsD.wVersion)!=1|HIBYTE(wsD.wVersion)!=1)WSACleanup();return ;SOCKET scSr=socket(AF_INET,SOCK_STREAM,0);SOCKADDR_IN adrSr;adrSr.sin_addr.S_un.

8、S_addr=htonl(INADDR_ANY); adrSr.sin_family=AF_INET;adrSr.sin_port=htons(6000);bind(scSr,(SOCKADDR *)&adrSr,sizeof(SOCKADDR);listen(scSr,5);SOCKADDR_IN adrCl;int len=sizeof(SOCKADDR);while(true)printf("bind%d success!n",6000);SOCKET scCon=accept(scSr,(SOCKADDR *)&adrCl,&len); ch

9、ar s_adr100;strcpy(s_adr,inet_ntoa(adrCl.sin_addr);linked=true;printf("link%s be created!n",s_adr);InitializeCriticalSection(&t_cs);gotHandle=CreateThread(NULL,0,&gotsListen,&scCon,0,NULL);setHandle=CreateThread(NULL,0,&setsListen,&scCon,0,NULL);while(linked)Sleep(10);T

10、erminateThread(setHandle,NULL);CloseHandle(gotHandle);CloseHandle(setHandle);DeleteCriticalSection(&t_cs);closesocket(scCon);printf("nlink%s closed!n",s_adr);closesocket(scSr);return ;DWORD WINAPI gotsListen(LPVOID lpParam)char gots1000;while(linked)/ EnterCriticalSection(&g_cs); i

11、f(recv(*(SOCKET *)lpParam,gots,1000,0)=-1)break;/ LeaveCriticalSection(&g_cs);puta(gots,1);linked=false;return 0;DWORD WINAPI setsListen(LPVOID lpParam)while(linked)geta(bufer);/ EnterCriticalSection(&g_cs);send(*(SOCKET *)lpParam,bufer,strlen(bufer)+1,0);/ LeaveCriticalSection(&g_cs); p

12、uta(bufer,0);ExitThread(NULL);return 0;void puta(char *s,int sta)int i=1;char s_tim16;getime(s_tim);switch(sta)case 0:EnterCriticalSection(&t_cs); while(i-) printf("b b");printf("local %sn %sn",s_tim,s);LeaveCriticalSection(&t_cs); break;case 1:EnterCriticalSection(&t

13、_cs); i+=buflen;while(i-)printf("b b");printf("NET %sn %sn",s_tim,s); printf(">%s",bufer);LeaveCriticalSection(&t_cs); break;void geta(char *s)char c;EnterCriticalSection(&t_cs); printf(">");buferbuflen=0='0'LeaveCriticalSection(&t_cs

14、); while(c=getch()if(c>31&&c<127) EnterCriticalSection(&t_cs); sbuflen+=c; sbuflen='0' printf("%c",c); LeaveCriticalSection(&t_cs);elseswitch(c) case 13: EnterCriticalSection(&t_cs); while(buflen-) printf("b b");LeaveCriticalSection(&t_cs); r

15、eturn;case 8:EnterCriticalSection(&t_cs); if(buflen) buflen-; printf("b b"); sbuflen='0'LeaveCriticalSection(&t_cs); break;3、客户端 client.cpp#include <stdio.h>#include <Winsock2.h>#include <windows.h>#include <conio.h>#include "socs.h"#pragma

16、 comment(lib,"ws2_32.lib")DWORD WINAPI gotsListen(LPVOID);DWORD WINAPI setsListen(LPVOID);void geta(char *);void puta(char*,int);void getime(char *);CRITICAL_SECTION t_cs;char bufer1000;int buflen;bool linked;void main(void)HANDLE gotHandle;HANDLE setHandle;char s_adr10;WSADATA wsD;if(WSAS

17、tartup(MAKEWORD(1,1),&wsD)return ;if(wsD.wVersion!=MAKEWORD(1,1)WSACleanup();return;SOCKET scSr=socket(AF_INET,SOCK_STREAM,0);while(true)printf("Ready to Connect:");scanf("%s",s_adr);SOCKADDR_IN adrSr;adrSr.sin_addr.S_un.S_addr=inet_addr(s_adr);adrSr.sin_family=AF_INET;adrSr.

18、sin_port=htons(6000);linked=!connect(scSr,(SOCKADDR *)&adrSr,sizeof(SOCKADDR); if(linked)printf("link%s created success!n",s_adr);InitializeCriticalSection(&t_cs);gotHandle=CreateThread(NULL,0,&gotsListen,&scSr,0,NULL);setHandle=CreateThread(NULL,0,&setsListen,&scSr

19、,0,NULL); while(linked)Sleep(10);TerminateThread(setHandle,NULL);TerminateThread(gotHandle,NULL);CloseHandle(gotHandle);CloseHandle(setHandle);DeleteCriticalSection(&t_cs);elseprintf("Failed to connect %s,check it and try again!n",s_adr);closesocket(scSr);printf("nlink%s be closed

20、!n",s_adr);return ;DWORD WINAPI gotsListen(LPVOID lpParam)char gots10000;while(linked)/ puts("running");/ EnterCriticalSection(&g_cs);if(recv(*(SOCKET *)lpParam,gots,1000,0)=-1)break;/ LeaveCriticalSection(&g_cs);puta(gots,1);linked=false;ExitThread(NULL);return 0;DWORD WINAPI

21、 setsListen(LPVOID lpParam)while(linked)geta(bufer);/ EnterCriticalSection(&g_cs);send(*(SOCKET *)lpParam,bufer,strlen(bufer)+1,0);/ LeaveCriticalSection(&g_cs);puta(bufer,0);ExitThread(NULL);return 0;void puta(char *s,int sta)int i=2;char s_tim16;getime(s_tim);switch(sta)case 0:EnterCritica

22、lSection(&t_cs);while(i-)printf("b b");printf("local %sn %sn",s_tim,s);LeaveCriticalSection(&t_cs);break;case 1:EnterCriticalSection(&t_cs); i+=buflen;while(i-)printf("b b");printf("NET %sn %sn",s_tim,s); printf(">%s",bufer); LeaveCrit

23、icalSection(&t_cs);break;void geta(char *s)char c;EnterCriticalSection(&t_cs);printf(">");buferbuflen=0='0'LeaveCriticalSection(&t_cs); while(c=getch()if(c>31&&c<127)EnterCriticalSection(&t_cs); sbuflen+=c;sbuflen='0'printf("%c",c)

24、;LeaveCriticalSection(&t_cs);elseswitch(c)case 13:EnterCriticalSection(&t_cs); while(buflen-)printf("b b"); LeaveCriticalSection(&t_cs); return;case 8:EnterCriticalSection(&t_cs); if(buflen) buflen-; printf("b b"); sbuflen='0'LeaveCriticalSection(&t_cs

25、); break;七、调试运行本实例在同一 ip和不同分别做了测试,运行状况达到了预期的效果,F面是相关的几张运行截图:服务器以及客户端启动的画面D:foind60B0 successg D:DebugClient _ esceAdp to Connect112710?0.建立连接之后提示信息以及叩令提示符D:DebugServET.exeplritlE&00Bl sue匚 llinkC127-0-S.,lJ be ci'eatedfu、D: DebugVClient_ esteReady to Conn&ct0_9_1linkLI27.0.9.11 created s

26、uccess!客户端向服务器发送信息F面来做一系列的测试查看程序防交叉输出的功能:1、连接之后服务端在写一些内容D:DebugServer-exenind-L6 000 successt link127.B_3.11 be cveatedT NET 0S:12:10le L1d* nice t neet you!>do yo* knoif Jwck? He is so badf and2、客户端发送了一条消息,服务端将消息插入,并继续等待输入端输入曲 D-DebugA5eTver. ez epind6000 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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论