Linux网络聊天系统_第1页
Linux网络聊天系统_第2页
Linux网络聊天系统_第3页
Linux网络聊天系统_第4页
Linux网络聊天系统_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

1、Linux网络聊天系统学院:信自学院班级:计科 092学号:200910405229姓名:指导教师:- 1 -前瞻在网络无所不在的今天资料来源:毕业设计(论文)网在In ternet上,有ICQ、MSN Gtalk、0ICQ等网络聊天软件,极大程度上方便了处于 在世界各地的友人之间的相互联系,也使世界好像一下子缩小了,不管你在哪里, 只要你上了网,打开这些软件,就可以给你的朋友发送信息,不管对方是否也同 时在线,只要知道他有号码。Linux 操作系统作为一个开源的操作系统被越来越多的人所应用, 它的好处在 于操作系统源代码的公开化!只要是基于 GNU公约的软件你都可以任意使用并修 改它的源代码

2、。但对很多习惯于 Windows操作系统的人来说,Linux的操作不够人 性化、交互界面不够美观,这给 Linux操作系统的普及带来了很大的阻碍。因此制 作一个 Linux 操作系统下的拥有人性化界面的实时通讯工具,将给那些刚刚接触 Linux操作系统的用户带来极大的方便,而且通过设计这样的一个应用程序还能更 好的学习网络编程知识和掌握 LINUX平台上应用程序设计开发的过程,以达到检 验学习成果的目的本课程设计主要实现一个 Linux 下的局域网聊天工具的设计。该设计主要分 为两部分,客户端部分和主机部分。运行服务器端程序可以和任意运行了客户端 程序的主机进行通信,通信内容能够通过终端显示出

3、来。两个部分都使用C语言,利用 vi 编辑器,通过 Socket 套接口编程实现相关功能本论文还设计了另一个网络聊天室程序,我们都知道网络聊天室是用户比较 喜欢的一种应用程序 ,借助聊天室和他的留言系统,用户可以及时互通信息,交流 思想。本次设计的系统主要采用了基于 C/S 模式开发了简易聊天室系统,在终端 字符界面, 支持用户管理, 用户名 /密码注册和登录, 客户端登陆到服务器聊天后, 可以在聊天室内与其他用户交流 (这个聊天室中的任何一个用户输入一段字符后, 室内的其他用户都可以看到这句话)。本设计使用网络套接字socket和多线程在网 络中的应用,并基于linux下的vi编辑器。本方案

4、经gcc调试器调试成功,可以在 单机网络聊天中使用。- # -shell编程1、目的为了巩固这个学期所学的linux操作系统中,对系统运行启动后的内存管理、 进程管理、文件管理、设备管理等的了解和熟悉以及一些linux平台上的操作。以下是两个Shell程序的练习。2、实现过程2.1 cd、 environ、 exit 扌旨令(i)源代码#in elude #i nclude #in elude #i nclude #i nclude #i nclude #in clude verrno .h#in clude#defi ne CMD_CD(cd)#defi ne CMD_ENVIRON (e

5、nviro n) #defi ne CMD_EXIT (exit)void Prin t(void);int In put(char ch10);void Cd(void);void Environ(v oid);int main(v oid)char ch1024;system(clear);prin tf(n*This is my shell*nn); while(1)q-3 -Prin t();(2)运行截图/hont/repotiSrnirunSSH_V?M_PIIS5KDHJslNWf low * loca idonu iriStELL-Zbin/baihTERM k irrmH S

6、TSIZhlMODO(TK.RG FILES 北 trIk厲【krc:打cxn/.g tk 1m)nv2讲砧l佔D刘ajrW/roQti,nT)IR-/usr/1 ib/qt-3 + lLSKR-roolLS lURS-no-00:fi-il0;di-00;34: ln-00;36:p i-4O:33: so-C0:35ibd-40;33;0l:cd-4:33; 01 :or0l;05137:41: mi-01; 05:37:41:k00:32:”cnd-OO:32:*.exe-00;32;*,conrm) ;32:*. blnrOO:32:*.bat-OU;32:*, sh OO;32: *

7、krsh-00;32: *, la.r-:3U*,Z-Cql :*.gzOO;Sk *.bz2-O0;3r:/honr/repor t$cd changed ucrkpa Lh? */hone/honr$cd wlchanged workpath? wl/honr/wl/hone/wl$exitexit shell!Think you!bye!root J,lota Ihus l repor (1 # |2.2 echo、help、jobs、quit/exit/bye 指令源代码#i nclude #i nclude #i nclude #i nclude #include #i nclude

8、 #i nclude verrno .h #in clude#defi ne CMD_ECHO(echo)#defi ne CMD_HELP(help)#defi ne CMD_JOBS(jobs)#defi ne CMD_QUIT(quit)#defi ne CMD_EXIT(exit)#defi ne CMD_BYEvoid Prin t(void); int In put(char ch10);void Echo(void);void Help(void);void Jobs(void);int main(v oid)char ch1024;(bye)system(clear);prin

9、 tf(n*This is my shell*nn);while(1)Prin t();sca nf(%s,ch);In put(ch);return 0;int In put(char cmd1024) if( cmd0 = 0 ) -5 -(2)运行截图echofisplay echo* contfnL after the contrnis an4 wraphr IpO Ipul ne hod and basic fvnct ion of she HJobfqutpuI currrnt a series ofqu 11/ex i i/byeex i t shf 11/horn?/ ip p

10、erj obsPID TTYTINE CM)bn、h %heIVD2477 pt/Ooo:oo:on嗣2】pt i/O00:00:01)4423 pK/000:00:00/hont/rtpor t$bc exit fbe 11!Th ank you!hytIroot oca Ihoii t repor i、网络聊天室的设计设计目的由于Linux的开源的特点,越来越多的人转而使用Linux做为PC机的操作系统。但是 Linux的真正兴起只是在最近几年,因此很多功能并不是很完善,并且由于Linux的开源特征,很多软件开发公司很难从中获得直接利益,因此很多Windows上的实用的软件,在 Linux

11、下却很少见。本课程设计正是为了解决Linux下局域网聊天问题而设计的,并且希望通过本课程设计可以更好的了解 Linux操作系统的原理,进一步掌握vi,gcc等工具的使用,并且熟悉Linux下的网络编程,以及多线程编程。- 7 -linux 介绍来源:Linux是一种自由和开放源码的类Unix操作系统。目前存在着许多不同的Linux,但它们都使用了 Linux内核。Linux可安装在各种计算机硬件设备中,从手机、平板电脑、路由器和视频 游戏控制台,到台式计算机、大型机和超级计算机。Linux是一个领先的操作系统,世界上运算最快的10台超级计算机运行的都是 Linux操作系统。严格来讲,Linux

12、这个词本身只表示 Linux 内核,但实际上人们已经习惯了用Linux来形容整个基于 Linux内核,并且使用 GNU工程各种工具和数据库的操作系统。Linux得名于计算机业余爱好者Linus Torvalds。Linux 操作系统是UNIX操作系统的一种克 隆系统。它诞生 于1991年的10月5日(这是 第一次 正式向外公布的 时间)。以后借 助于In ternet 网络,并经 过全世界 各地计算机爱好者的共同努力下,现已成为今天世界上使用最多的一种UNIX 类操作系统,并且使用人数还在迅 猛增长。Linux操作系统的诞生、发展和成长 过程始终依赖着以下五个重要支柱:UNIX操作系统、MIN

13、IX 操作系统、GNU计划、 POSIX标准和In ternet网络。Lin ux的基本思想有两点:第一,一切都是文件;第二,每个软件都有确定的用途。其中第一条详细来讲就是系统中的所有都归结为一个文件,包括命令、硬件和软件设备、操作系统、进程等等对于操作系统内核而言,都被视为拥有各自特性或 类型的文件。 至于说Linux是基于Unix的,很大程度上也 是因为这两者的 基本思想十分相近。提到Linux我们不能不提 GNU和Unix。Richard M.Stallman建立的自由软件联盟 出版了两种许可证,GNU通用公共许可证(GNU Gneral Public License,GPL和 GNU函

14、 数库通用公共许可证(GNU Library Gneral Public License,LGPL)大部分GNU工程的 软件和文档是以GNU通用公共许可证发行的,但是有一些库是以GNU函数库通用 公共许可证发行的。按照 GNU通用公共许可证的规定,Li nux的源代码可以自由获 取,这满足了我们学习该系统的强烈愿望。GPL充分体现了 Stallman的思想:只要用户所做的修改是同等自由的,用户可以自由地使用、拷贝、查询、重用、修改甚 至发布这个软件。通过这种方式,GPL保证了 Linux(以及同一许可证下的大量其他 软件)不仅现在自由可用,而且皮后经过任何修改这后都仍然可以自由使用。Linux

15、操作系统是UNIX操作系统的一个克 隆版本。UNIX操作系统是美国贝 尔实验室的肯汤普逊 Ken .Thompson和丹尼斯里奇Denn is Ritchie 于1969年夏在 DEC PDP-7小 型计算机上开发的一个分时操作系统。当时Ken Thompson为了能在闲置不用的PDP-7计算机上运行 他非常喜欢的星际旅行(Space travel )游戏,在1969年夏天乘他夫人回家乡加利福尼 亚渡假期间,在一个月内开发出了 unix操作系统的原型。当时使用的是BCPL语言(基本组合编程语言),后经Dennis Ritchie 于1972年用移植性很强的C语言进行了改写,使得 UNIX系统在

16、大专院校得到了推广。1981年IBM公司推出微型计算机IBM PC。在1981-1991年间MS-DOS操作系统一直是微机上操 作系统的主宰。此时 计算机硬件价格 虽逐年下降,但软件价格仍居 高不下。 当时Apple的MACos操作系统可以说是性能最好的,但是其天价没人能够轻易靠近。到1991年,GNU计划已经开发出了许多 工具软件。最受期盼的 GnuC编 译器已经出现,但还没有开发 出免费的GNU操作系统。即使是MINIX也开始 有了版权,需 要购买才能得到源代码。 而GNU的操作系统HURD 直在开 发 之中,但并不能在几年内完成 。对于Linus来说,已经不能等待了 。从1991 年4月

17、份起,他开始酝酿并着手编制自己的操作系统。刚开始,他的目的很简单,只是为 了学习In tel 386体系结构保护模式 运行方式下的编程技术。但后来Linux的发展却完全改变了初衷。1991年初,Linus开始在一台386sx兼容微机上学习 minix操作系统。 通过学习,他逐渐 不能满足于 mi nix系统的现有性能,并开始酝酿开发一个新的免费操作 系统。根据Linux在comp.os.minix新闻组上发布的消息,我们可以知道他 逐步从学习 mi nix系统到开发自己 的Linux的过程。从1991年的4月份开始,Linus几乎花了全部 时间研究386-minix系统(hack the ke

18、rnel) ,并且 尝试着移植 GNU的软件到该系统上(GNU gcc、 bash、gdb等)。并于4月13日在comp.os.minix 上发布 说自己已经成功 地将bash移植到了 minix上,而且已经爱不释手、不能离开这个shell软件了。第一个与Linux 有关的消息是在 1991年7月3日在comp.os.minix 上发布的(当然此时还不存 在Linux这个名称,当时Linus的脑子里想的可 能是FREAX,FREAX的英文含义是怪诞的、怪物、异想天开等)。其中透露 了他正在进行Linux系统的开发,并且在Linux最初的时候已经想到要实现 与POSIX( UNIX的国际标准)的

19、兼容问题了。在Linus 的下一发布的消息中(1991年8月25日comp.os.minix), 他向所 有 mi nix 用户 询问What would you like to see in mini x?(你最想在mi nix中见到什么?),在该消息中他首次透露出 正在开发一个(免费 的)386(486)操作系统,并且说只是兴趣而已,代码不会很大,也不会象 GNU 的那样专业。开发 免费操作系统这个想法 从4月份就开始酝酿了,希望大家 反馈一些对于minix系统中喜欢那些特色不喜欢什么等信息,由于实际的和其它一些原因,新开发的系统刚开始与minix很象(并且使用了 minix的文 件系统)

20、。并且已经成功地将 bash(1.08 版)和gcc(1.40 版)移植到了新 系统上,而且 再过几个月就可以使用了。最后,Linus申明他开发的操作系统 没有使用一行 mi nix的源代码;而 且由于使用了 386的任务切换特性,所以该操作系统不好移植(没有可移植性),并且只能使用AT硬盘。对于Linux的移植性问题,Linus当时并没 有考虑。但是 目前Linux几乎可以运行在任何一种 硬件体系结构上。到了 1991年的10月5日,Linus 在comp.os.minix新闻组上发布消息,正式 向外宣布 Linux 内核系 统的 诞生(Free mi nix-like kernel sou

21、rces for 386-AT)。这段消息可以称为 Linux 的诞生宣 言,并且一直广为流传。因此10月5日对Linux社区来说是一个特殊的日 子,许多后来 Linux的新版本发 布时都选择了这个 日子。所以 RedHat公司选 择这个日子 发布它的新系 统也不是偶然的。3. 技术说明3.1TCP UDP协议的概念UDPUDP是用户数据报协议的简称。它是以中午连接的逻辑通信信道。UDP在传送数据之前不需要先建立连接,远地主机的传输层在收到udp数据报后,不需要给出任何确认,所以不能保证其交付时可靠。它的特点是:因无连接,故提供的是不可 靠的信道,但也是因无连接而具有很好的传输效率。TCPTC

22、P是传输控制协议的简称,它是提供一条全双工的、可靠的信道。TCP提供面 向连接的服务,在传送数据之前必须先建立连接, 数据传送结束后要释放连接。TCP 不提供广播和多播服务。由于TCP要提供可靠的、面向连接的运输服务,所以不可避免地增加了许多系 统开销,比如确认、流量控制、计时器以及连接管理等都需要占用许多系统的时空 资源。两个计算机之间如果使用 TCP通信,其连接过程需要三次握手实现,如实 验图1-1所示。socketconnect f阳擢)卜(主动打开);II服务器SYN JSocketr Bindr listen I (被动打开Accept個塞SYN K* ACK J+l- Iconne

23、ct 傕回)丄二H ACK K+lI.IIIII三次握手建立TCP连接对于两个计算机之间连接的释放过程也需要类似的3次握手的互相确认的过曲客户riN 1.ACK O.SFQ-2500臘务番进稈f?LRf?LRACK LSEQ-6000, AN-2501;FIN=ltSEQ600ltfcN=250lI! |i|; ACK=L SEQ=3&QL AN6002TCP连接的释放过程3.2客户/服务器模型在客户/服务器模型中,多个相互通信的计算机都作为客户端,与网络服务器进 行连接,并通过服务器进行信息的传递。所以多个客户端之间的通信就变为了客户 端与服务端的通信。所以,采用客户/服务器模型进行网络聊天

24、需要分别编写服务器 端和客户端的程序,服务器和客户端之间相互通信的同步关系和各自的程序流程如 实验图1-3所示。-r 4衆划珥31忡尊尿Socket通信流程图3.3 网络套接字( socket)Socket接口上TCP/IP网络应用程序接口 (API),它提供了许多函数和例程,程序 员可以使用它们来开发TCP/IP网络应用程序。使用Socket接口进行网络通信的过程如图1-3所示,简要步骤如下:建立一个Socket.(2) 按要求配置socket,将socket连接到远程主机或给socket指定以各本地协 议端口。(3) 按要求通过socket发送和接受数据。(4) 关闭此 socket。3.

25、4 多线程上述点对点通信的实现知识完成了主机进程与服务器进程之间的连接,建立连 接的进程之间是一对一的联系,即主机的一个进程与服务器的一个进程之间建立的 连接。而每个进程进行通信的环节都包括了发送信息和接口信息两个任务,这两个 任务通过一个端口地址发送和接收。对于多个并发的任务需要创建多个线程或线程去实现。使用一个进程去完成发送信息是没有问题的,因为发送总是主动的;而使用同一个进程再去完成接受信息 去不一定会成功,因为接受信息是被动的,所以当没有信息可以接收时,该进程就 会被阻塞,从而导致发送任务也一起被阻塞。同一个端口的发送和接收是两个并发 任务,应该由两个不同的任务去分别完成信息的发送和接

26、收。这样,当接收信息任 务因没有信息而被阻塞时,不至于影响发送任务的执行。在网络通信中,端口地址是以进程为单位进程分配的,而一个进程与外界的消 息发送与接收必须通过分配给它的同一个端口进行。因此,不能通过创建进程方式 来解决上诉问题,因为两个进程会分别对应两个不同的端口,而发送和接收必须使 用同一端口。线程不是资源分配的单位,所以如果使用两个线程不会对线程分配新 的端口。因此,本实验需要使用两个线程去分别完成发送和接收信息的任务,这两 个线程共享其进程拥有的统一个端口地址。由于创建进程的进程本身会作为一个线 程来调度,所以只需要再创建一个线程专门负责接收信息就可以了。因此,对于从每个客户端发来

27、的请求,服务器端都要创建相应的线程去接收并 处理;同理,对于客户端而言,也要创建一个线程去读取服务器端发来的信息。- 13 -4. 系统的实现4.1Linux 提供的有关 Socket 的系统调用(1) Socket()作用: socket 函数为客户机或服务器创建一个 sokcet格式:int socket(int family,int type,int protocol);参数说明:Family:表示地址族,可以去 AF_UNLX和AF_INT其中,AF_UNLX只能够用于单一的 UNIX系统进程间通信;AF_INT是针对In ternet 的,因而可以允许在远程主机之间通信,实验中使用A

28、F_INT。Type网络程序所采用的通信协议,可以取SOCK_STREA或SOCK_DGRAM其中,SOCK_STREA表明使用的是TCP协议,这样提供按顺序的、可靠的、双向、面 向连接的比特流;SOCKE_DGRA表明使用的是UDP协议,这样只会提供定长、不可 靠、无连接的通信。(2) bind( )格式:int bind(int sockfd,struct sockaddr *addr,int addrlen);参数说明:Sockfd socket的文件描述符号。Sockaddr表示名字所用的一个数据结构,用来保存地址(包括IP地址和端口)Addrle n:设置结构大小长度。(3) lis

29、ten()格式:int listen(int sockfd, int backlog);作用:监听连接信号,和 accepted 函数合同。参数说明:Sockfd表示socket调用返回的文件描述符。Backlog:表示接入队列允许的连接数目,大多数系统允许20个,也可以子定义5 10 个。(4) accept()格式:Int accept (int sockfd, void *addr, int *addrlen);作用:与 listen 函数合用,监听信息、接收客户端请求。参数说明:Sockfd:表示socket的文件描述符。Addr:表示指向局部的数据结构 struct sockaddr

30、-in的指针。Addrle n:表示地址的长度。(5) connect()格式:int connect( int sockfd , struct sockaddr *serv_addr , int addrlen);作用:在面向连接的系统中客户及连接服务器时使用,connect必须在bind后使用。参数作用:Sockfd表示socket的文件描述符。Serv-add:表示村访目的端口和ip地址(套接字)的数据结构。(6) send() 和 recv()格式 1:Int send (int sockfd, const vod *msg,int len, int flags);功能:发送信息。格式

31、 2:Int recv (int sockfd , void *buf,int len, usigned int flags);作用:用于流式socket、数据报socket内部之间的通信。(7) close( ) 和 shutdown ( )格式:Close( int sockfd)或Int shutdown(int sockfd , int how);- 15 -4.2 TCP通信实现(1) 服务端源程代码#in elude #in elude #in elude #inelude #i nelude #i nelude #in elude #i nelude #i nelude verr

32、no .h#defi neMAXLEN5/ maxim unconn ecti onqueue len gth#defi neBUFSIZE 4096#defi neDEFAULT_P0RT8000int errexit(e onst char *format, .);intpassive_tcp(i nt port, int maxle n);intsen d_to_others(i nt fd, int liste n_sockfd, int maxfd, fd_set *rfds);/*main - start the server*/intmain (i nt arge, char *

33、argv) intport = DEFAULT_PORT; /port nu mber;structsoekaddr_i n fsin;/ the from address of a elie nt;intliste n_sockfd;/servers liste n socketfd_setread_set;/ active deseripter setfd_setready_set;/ from - address len gthint alen;intfd,maxfd;switch (arge) ease 1: break;ease 2:port = atoi(argv1); break

34、;客户端源程序代码如下#i nclude #include #include #include verrno.h#i nclude #in clude #include #in clude #include #in clude #include #define MAX BUF SIZE 1024#defi ne#defi ne#defi neLINELEN128DEFAULT_HOST127.O.O.1DEFAULT PORTIOOOint main (i nt argc, char *argv) /*charint*host = DEFAULT_HOST; port = DEFAULT_PO

35、RT;switch(argc) case 1: host = DEFAULT_HOST; break; case 3:port = atoi(argv2); case 2:host = argv1; break;default:fpri ntf(stderr,usage: tcp_echo host portn); exit(1);*/int sockfd;int sin _size;struct sockaddr_i n dest;char bufMAX_BUF_SIZE + 1; fd set rfds*-15 -5. 运行效果程序测试环境:linux操作系统。测试软件:vmware虚拟机

36、(1)在编写完 TCP服艮务端程序 chatserver_tcp.c errexit.c、passive_sock.c passive_tcp.c 后,用 gcc server chatserver_tcp.c errexit.c passive_sock.c passive_tcp生成程 序 server。在编写完TCP客户端程序client.c后,用gcc client client.c生成程序client(3) 在主机上打开一窗口,运行 server。(4) 再打开另外四个(本次测试打开四个客户端)窗口运行client,输入服务器的IP地址,并检查器结果的正确性。输入:【主】# ./se

37、rver 8002【从】# ./client 127.0.0.1 8002(127.0.0.1 为本机的 ip 地址)输出:(5) 客户端以交错发送信息的信息将信息发出,服务器接收信息并转发给其它客户端。客户端通过键盘输入消息内容平回车,以发送消息;按键Ctrl+Z则退出聊天室。运行结果:He f tacly, can cha IJ1s inybody here?client 4 says: who are you?client 6She i舌 爾nyling! T,1 m ang ling!c I icnl 5 aay$: So peop le here Ito do ir hporwork

38、e !Lilc Edit里iewterminal曲 prcx3|IhosI root* cd /usrZiourcr/cha 1/rwiiIhus i chu i) V ,/c I it tn: /cl inH ip p)r Ifor pxanpIc: ,/T I SO02lie r?ady F can ch E1c t ien l 7 say $ : I s mylxid here?who arc ou fc t icn l t *gy$: Slip i s us 群耳 ling!c I i en l 7 say $ i s J m minj; I inj; ?cl if n l 5 ay

39、s: So mmy pc op lc here r liavr la rry honrwiirkr Jhc File dh View Terintnal Qo Hdp(r oot Llc*ra I hoi t fool cd / sr/njur ce/cha 1 f(roollocalhosl chail ./client I27.O.OJ &002Be rrad , ran cha Hcl irril 7 titys: I anybody hert client 4 *昼、: uho art you?She is wmg I i呼!cI ieni 7 呂j*y$; L1 m I ing!rl

40、irtH 5 $轟y$; So mrny people here .1 have to da (a hoar炖rkeHy亡!通过本次课程设计对Li nux网络聊天室的设计,确实积累和总结了不少的经验, 锻炼了我的独立工作和实际动手能力,加深了对计算机网络中socket工作原理及其相互联系的认识,提高了对复杂的综合性实践环节具有分析问题、解决问题、 概括总结的实际工作能力,对网络编程项目的开发、设计过程有初步认识。通过本次课程设计对shell程序和Linux网络聊天室的设计,确实积累和总结了不少的经验,锻炼了我的独立工作和实际动手能力,加深了对shell的理解和对计算机网络中socket工作原理

41、及其相互联系的认识,提高了对复杂的综合性实践环 节具有分析问题、解决问题、概括总结的实际工作能力,对网络编程项目的开发、 设计过程有了更进一步的认识。-19 -.参考文献1 Bruce Molay. Unix/Linux 编程实践教程 . 北京:清华大学出版社 ,20112 金钟夫,杜刚.浅析socket网络编程J.微计算机信息,2002,3-2,87-893 张饶学,Linux网络编程M.北京:清华大学出版社,20004 赵敏哲, 64位 Linux 操作系统与应用实例 M. 北京:机械工业出版社 ,2001附录服务器端源代码#include #include #include #inclu

42、de #include #include #include #include #include #defineMAXLEN5/ maximun connection queuelength#defineBUFSIZE4096#defineDEFAULT_PORT8000int errexit(const char *format, .);intpassive_tcp(int port, int maxlen);intsend_to_others(int fd, int listen_sockfd, int maxfd, fd_set *rfds);/*main - start the serv

43、er */ intmain(int argc, char *argv)intport = DEFAULT_PORT; /port number;structsockaddr_in fsin;/ the from address of a client;intlisten_sockfd; /servers listen socketfd_setread_set;/ active descripter setfd_setready_set;/ from - address lengthint alen;intfd,maxfd;switch (argc) case 1: break;case 2:p

44、ort = atoi(argv1); break;default:errexit(usage: echoserver_tcp portn); listen_sockfd = passive_tcp(port,MAXLEN); printf(listen_sockfd:%d listeningn,listen_sockfd);/ maxfd = getdtablesize(); maxfd = listen_sockfd;FD_ZERO(&ready_set);FD_SET(listen_sockfd,&ready_set);while (1) memcpy(&read_set, &ready_

45、set, sizeof(read_set);if (select(maxfd+1, &read_set, (fd_set *)0, (fd_set *)0, (struct timeval *)0) 0)errexit(select: %sn,strerror(errno);if (FD_ISSET(listen_sockfd, &read_set) /* there is a client want to connect with* the server,the server receive it,and* allocate a new descripter ssock to this* c

46、onnection,and add it to the select pool */int alen=client_sockfd; sizeof(fsin);client_sockfd = accept(listen_sockfd, (struct sockaddr*)&fsin, (socklen_t *)&alen);if (client_sockfd maxfd)maxfd = client_sockfd;printf(maxfd is: %dn,maxfd);printf(listen_sockfd accept aconnection,client_sockfd: %dn,clien

47、t_sockfd);FD_SET(client_sockfd,&ready_set);for (fd=0; fd=maxfd; +fd)if (fd != listen_sockfd & FD_ISSET(fd, &read_set)if (send_to_others(fd, listen_sockfd, maxfd, &ready_set) = 0) (void)close(fd); FD_CLR(fd,&ready_set);/* send_to_others - send message that recevived from fd to other connected peoples

48、;*/int send_to_others(int fd, int listen_sockfd,int maxfd, fd_set *ready_set)/* Arguments:*fd-the client which has message to others;*listen_sockfd -the servers listening fd;*maxfd-the maxfd of all fds in the ready_set;*read_set-the set of fd that connected with the server;*/charbufBUFSIZE;intcc,n=0

49、;inttmp_fd;cc = read(fd,buf,sizeof(buf);if (cc 0) errexit(echo read: %sn,strerror(errno);if (cc) printf(server received %d bytes from client_sockfd: %dn,cc,fd); for (tmp_fd = 0; tmp_fd = maxfd; +tmp_fd) if (tmp_fd != listen_sockfd) & (tmp_fd != fd) & FD_ISSET(tmp_fd,ready_set) char tmp_buf20;char *f

50、d_str; sprintf(tmp_buf,client ); fd_str = gcvt(double)fd,5,tmp_buf+7);if ( ( write(tmp_fd, tmp_buf, strlen(tmp_buf) 0) errexit(write: %sn,strerror(errno); sprintf(tmp_buf, says: );if ( ( write(tmp_fd, tmp_buf, strlen(tmp_buf) 0) errexit(write: %sn,strerror(errno);if ( (n = write(tmp_fd, buf, cc) 0)

51、errexit(write: %sn,strerror(errno); elseprintf(send back %d bytes to client_sockfd:%d successed!n,n,tmp_fd); return cc;/* errexit.c - errexit */#include #include #include /* errexit - print an error message and exit;*/interrexit(const char *format, .)va_list args;va_start(args, format);vfprintf(stderr, format, args);va_end(args);exit(1);/* passive_sock.c - passive_sock */ #include #include #include #include #include #include #include

温馨提示

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

评论

0/150

提交评论