vb聊天室实验报告_第1页
vb聊天室实验报告_第2页
vb聊天室实验报告_第3页
vb聊天室实验报告_第4页
vb聊天室实验报告_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

1、CENTRAL SOUTH UNIVERSITY计算机网络课程设计报告学生姓名:班级: 学号:指导教师:设计时间:目录第一章设计目的、任务1.1设计目的1.2设计的任务 第二章系统分析设计2.1系统流程分析2.2系统功能需求分析2.3系统运行要求2.4系统数据要求第三章系统实现3.1系统界面设计3.2系统功能模块设计第四章体会和建议第一章设计目的、任务1.1设计目的1.掌握Linux下的c语言编程。2. 熟悉Linux下网络编程流程,巩固、应用这学期学过的计 算机网络知识。3 .掌握socket编程方法。1.2设计的任务1. 利用一种编程语言和通信编程 Socket接口编写一个简单的聊 天室。

2、2. 使用TCP或UDP接口完成信息传送,利用多线程技术实现服务 器端的多个TCP连接的建立。3. 聊天室基本功能:(1).基本要求可以完成群聊、私人聊天,实时发送和显示聊天信息,完成好友列表;(2).进一步要求带表情,附件发送,聊天信息的加密传送, 设置黑名单等第二章系统分析设计2.1系统流程分析客户端与服务器通信过程整体过程如下图:太网使用TCP套接字编程实现基于TCP/IP协议的面向连接的通信,分 为服务器端,客户端。*客户/服务器模型:在客户/服务器模型中,多个祥伙同心得计算机都作为客户端, 与 网络服务器进行连接,并通过服务器进行信息的传递。所以多个客户 端之间的通信就变成了客户端与

3、服务端的通信。采用客户 /服务器模 型进行网络聊天需要分别编写服务器端和客户端的程序, 服务器和客 户端之间相互通信的同步关系和各自的程序流程如下图:服务器创 socketsoeket()昭ckid绑足端1 Ibind()客户机socket。 Ksocket监听Hstcn()读取接收到的信息read()conneci( wnte()发送信息 wri(e(客户/服务器模型各自流程write()请求连接发送信息读取接收到的信息(1) 服务端:a. 初始化服务端socket,指定端口。b. 将创建的套接字绑定到指定的地址结构。c. liste n()函数设置套接字为监听模式,使服务器进入被动打开的状

4、态。d. 接受客户端的连接请求,建立连接。e .接收、应答客户端的数据请求,终止连接。(2) 客户端:a. 使用socket()函数创建套接字。b. 调用connect()函数建立一个与TCP服务器的连接。c. 发送数据请求,接收服务器的数据应答。d. 终止连接。2.2系统功能需求分析(1)服务器端a. 接收客户端连接,系统创建套接字并绑定端口, 设置为监听模式。b. 每监听到一个客户端请求,就产生一个子进程服 务客户端。c. 接收消息并转发消息。(2) 客户端a. 连接服务器功能:在连接服务器是要知道服务器的IP地址以及服务器绑定的端口,所以用户要输入服务器的 IP地址,根据已知的IP地址连

5、接服务器,若连接成功,则 显示欢迎用户界面。b. 发送聊天信息: 可以选择群聊和私聊,如果是群聊, 则没有限制,正常输入信息;如果是私聊,则要输入要私聊 对象的用户名,对方才可以接受到,其他用户端也会收到,但不会显示到屏幕上。c. 接收信息:由于我采用的是服务器见到信息就转发 给所有客户端,所以默认是群聊,如果是私聊,接收方会判 断收到的信息的标识符,是否该显示出来。2.3系统运行要求操作系统:ubu ntu 10.10编程语言:linux 下的c语言编辑工具:vi编辑器编译工具:gcc调试工具:gdb2.4系统数据要求客户端需要首先在终端下通过ifconfig命令获得服务器IP地址。并且需要

6、输入自己的用户名。第三章系统实现3.1系统界面设计由于我是在linux下用c语言编写程序,暂时还没有学到用 GDK 开发图形界面。我做的是简易聊天室,不需要注册,登陆,直接打开 终端,连接服务器就可以发送消息,没有界面对聊天没有太大影响, 只不过没有那么直观,美观。3.2系统功能模块设计采用多线程并发服务客户端,提高服务效率。父进程没检测到有客户端连接请求,调用fork()函数产 生一个子进程服务客户端。服务器客户端父进程醱泌客户1客户2子进程子进子进程connsetfd客户3(1)以下是上网查找资料,在socket编程中要用到的主要数据结构及函数:Int socket(i nt family

7、nt type,i nt protocol);family 指定协议簇,IPv4下则为 AF_INET 。 type 指定套接口类型: SOCK_STREAM,SOCK_DGRAM,SOCK_SEQPACKET,SOCK_RAW。(流套接字,数据报套接字,有序分组套接字,原始套接字)protocol:IPPROTO_TCP ,IPPROTO_UDP ,IPPROTO_SCTP ,分另U是 TCP 传输协议,UDP 传输协议,SCTP传输协议;函数返回一个非负整数值,类似于文件描述符(linux内核知识),称之为套接口描述字,简称套接字。字节序函数:#in clude ui nt16_t hto

8、 ns(ui nt16_t host16bitvalue); uin t32_t hto nl(ui nt32_t host32bitvalue);返回:网络字节序值.connect 函数#in clude int conn ect(i nt sockfd, const struct sockaddr *servaddr, sockle n_t addrle n); 返回:0 成功,-1 出错。sockfd是socket函数返回的套接口描述字,servaddr 和addrlen 是指向服务器的套接口地址结构指针和结构大小。bind 函数#in clude int bin d(i nt sock

9、fd, const struct sockaddr *maddr, sockle n_t addrle n);返回:0 成功,-1 出错。进程可以把一个特定的IP地址捆绑到他的套接口上,但此IP地址必须是主机的一个接口。对于IPv4,通配地址是INADDR_ANY ,其值一般为0 ;使用方法如下:struct sockaddr_i n servaddr;servaddr.sin_addr.s_addr = hto nl(INADDR_ANY);liste n 函数#in elude in t liste n(i nt sockfd, int backlog);返回:0 成功,-1 出错。lis

10、ten把未连接的套接口转化为被动套接口,指示内核应接受指向此套接口的连接请求。第二个参数规定了内核为此套接口排队的最大连接数。参数backlog曾经规定为监听套接口上的未完成连接队列和已完成连接队列总和的最大 值。accept 函数#in clude int accept(i nt sockfd, struct sockaddr *cliaddr, sockle n_t *addrle n);返回:非负描述字 一OK,-1 出错。accept从已完成连接队列头返回下一个连接,若已完成连接队列为空,则进程睡眠(套接口为阻塞方式时)。参数cliaddr和addrlen返回连接对方的协议地址,其中a

11、ddrlen 是值-结果参数,调用前addrlen 所指的整数值要置为cliaddr所指的套接口结构的长度,返回时由内核修改。accept成功执行后,返回一个连接套接口描述字。read() 函数ssize_t read(int fd,void * buf ,size_t count);函数说明read()会把参数fd所指的文件传送 count个字节到buf指针所指的内存中。若参数count为0,则read为实际读取到的字节数,如果返回0,表示已到达文件尾或是无可读取的数据,此外文件读写位置会随读取到的字节移动。write()函数:ssize_t write (int fd,const void

12、 * buf,size_t count);函数说明write()会把参数buf所指的内存写入 count个字节到参数fd所指的文件内。当然,文件 读写位置也会随之移动。(2)详细设计:服务端:A.所需头文件:#include #include #include / #include #include / #include / #include #include #include #include #include #include #include数据类型定义定义数据结构sockaddr_in提供socket函数及数据结构B.定义socket、初始化并赋值:int sockfd;struct

13、sockaddr_in my_addr;sockfd = socket(AF_INET,SOCK_STREAM,0);my_addr.sin_family = AF_INET;my_addr.sin_port = htons(port);my_addr.sin_addr.s_addr = INADDR_ANY;bzero(&(m y_addr.sin_zero),0);C. 将创建的socket绑定到对应地址和端口:if(bind(sockfd,(struct sockaddr* )&m y_addr,sizeof(struct sockaddr) = -1)perror(bi nd);exi

14、t(1);绑定出错,则会报告对应的错误。D. 为了保证子进程间能相互通信,设置一块共享内存区域:key_t shmid;/shmid = shmget(IPC_PRIVATE,1024,PERM);if(shmid = shmget(IPC_PRIVATE,1024,PERM) = -1)fprintf(stderr,Create Share Memory Error:%sna,strerror(errno);exit(1);E:将父进程设置为监听状态:if(listen(sockfd,BACKLOG) = -1)/在指定端口上监听perror(listen);exit(1);printf(l

15、isteningn);监听状态设置失败,则报错。 F:检测并接受客户端的请求连接:接收客户端连接if(clientfd = accept(sockfd,(struct sockaddr* )& their_addr, &sin_size) = -1)/perror(accept);exit(1);printf(accept from:%dn,inet_ntoa(their_addr.sin_addr);接收连接后,显示客户端信息;否则报错。G:接收到客户端连接后,产生子进程对客户端服务:else if(pid = 0)int datalen;close(listenfd);printf(%s

16、进入了聊天室.n, inet_ntoa(client.sin_addr);while(1)datalen = read(connectfd, buf, BUF_SIZE);bufdatalen = 0;while(strcmp(temp, buf)printf( 用户 说: %sn, inet_ntoa(client.sin_addr), buf);write(connectfd, buf, BUF_SIZE);strcpy(temp, buf);H:父进程继续监听,并关闭已连接套接字描述符:if(pid = fork() 0) close(connectfd);continue;客户端:A:

17、所需头文件:定义数据结构sockaddr_in提供socket函数及数据结构数据类型定义#include #include / #include / #include / #include #include #include #include #include#includeB:首先判断客户端的输入参数是否正确:if(argc J00*1 qbiliiO4#AntlK -Rtt(Ff HtQ M flBfq*4lUzhMbbuntui-iUF.f .t.l MAPanI hMt 理rt HAMFW+mn啤 * UI.M4 MH 站y 舛 rf 卜(O ffaf C#Mt mH 亠*黑|ff7T

18、.ll|QICE 7 qq 疋 U*Wuntiiz-4li扎辭UM5 AM./ql: +直鼻: MlUhKfUbUATuiL-lIZT.t.t.l 12M3 AML医口n訝MtrWBTT. MMmUzMoliJbiinffiw;-f 削理 tKCWflF jllitfefd呻 KCtpr Ifrwir-L2155mEWUrhMmtamtu;-* .刊n biitf iuttMi i mtmlAgMC6pt frw:lZl37at WtnlnaK毗 H 112:254 I?艇pt AMUhifefl m:H;J|i鲜mat 422!Z3:1SiCeptirtniiq8已f!IF 22:lIMsK

19、STTi HA fKiHilBl*quUzhao(ubuntu:-文件(F) (E)査看(V)撰索终端(T)帮助(H)qulizhaoubuntu:-$ ./qql 127.0.0.1 12345 BBBI 欢迎来到聊天室!AAA:haha (22:25:3)AAA:大家好(22:25:15) CCC:你们纾(22:26:1) 我雯下了.耳见BBB:aTT 胃见(22:26:16)IACqulizhaoubuntu:*$ ./qq ibing success!listeningaccept from:-1216637280 listeningaccept from:-1216637280 li

20、steningAAA:haha (22:25:3) AAA:大家好(22:25:15) accept from:-1216637280 listeningCCC:你们好(22:26:0)BBB:我要下了,再见(22:26:16)第四章体会和建议课程设计前,对网络编程了解甚少,只是平时实验做过关于网络的距离矢量路由算法。决定趁这次课程设计好好补补网络编程的基 础知识。于是选了一个自己比较感兴趣的课题:网络聊天室。课程设计开始前几天,从图书馆借了几本关于 linux环境的网 络编程书籍,同时参考了网上一些资料,对socket编程的基础知识, 用到的数据结构和函数做了很多功课, 基本了解了大致框架后,又把计算机网络课本上的关于 socket网络编程的代码对照之前做的 笔记仔细研读了一遍,对socket的建立,初始化,监听,连接,以 及发送消息,接收消息有了比较清楚地认识。接下来仿照课本上的框架,再结合自己的认识,成功写出了客户 端,服务的的连接。基本实现了客户端可以向服务器发送消息,服务 器再反馈消息给客户端。这一小步的成功让我信息大增,对接下来的 挑战充满期待。但是,出乎意料的是,问题很快就来了,并且问题还很大。再 实现了每个客户端可以和各自对应的子进程通信

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论