课程设计---基于linux网络聊天室的设计内容摘要:

《基于 Linux 网络聊天室的设计 》 第 8 页 共 21 页 上述点对点通信的实现知识完成了主机进程与服务器进程之间的连接,建立连接的进程之间是一对一的联系,即主 机的一个进程与服务器的一个进程之间建立的连接。 而每个进程进行通信的环节都包括了发送信息和接口信息两个任务,这两个任务通过一个端口地址发送和接收。 对于多个并发的任务需要创建多个线程或线程去实现。 使用一个进程去完成发送信息是没有问题的,因为发送总是主动的;而使用同一个进程再去完成接受信息去不一定会成功,因为接受信息是被动的,所以当没有信息可以接收时,该进程就会被阻塞,从而导致发送任务也一起被阻塞。 同一个端口的发送和接收是两个并发任务,应该由两个不同的任务去分别完成信息的发送和接收。 这样,当接收信息任务因没有信 息而被阻塞时,不至于影响发送任务的执行。 那么,发送和接收两个任务是使用两个进程还是两个进程去完成呢。 在网络通信中,端口地址是以进程为单位进程分配的,而一个进程与外界的消息发送与接收必须通过分配给它的同一个端口进行。 因此,不能通过创建进程方式来解决上诉问题,因为两个进程会分别对应两个不同的端口,而发送和接收必须使用同一端口。 线程不是资源分配的单位,所以如果使用两个线程不会对线程分配新的端口。 因此,本实验需要使用两个线程去分别完成发送和接收信息的任务,这两个线程共享其进程拥有的统一个端口地址。 由于创建进程的 进程本身会作为一个线程来调度,所以只需要再创建一个线程专门负责接收信息就可以了。 因此,对于从每个客户端发来的请求,服务器端都要创建相应的线程去接收并处理;同理,对于客户端而言,也要创建一个线程去读取服务器端发来的信息。 《基于 Linux 网络聊天室的设计 》 第 9 页 共 21 页 3 系统 设计 系统结构设计 本系统采用客户 /服务器模型, 在 TCP/IP 网络应用中,通信的两个进程间相互作用的主要模式是客户 /服务器模式( Client/Server model),即客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务。 客户 /服务器模式的建立基于以下两点:首 先,建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用。 其次,网间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为二者的数据交换提供同步,这就是客户端 /服务器模式的 TCP/IP。 在客户 /服务器模型中,多个相互通信的计算机都作为客户端,与网络服务器进行连接,并通过服务器进行信息的传递 [4]。 所以多个客户端之间的通信就变为了客户端与服务端的通信。 服务 器 端和客户端的主要组成如下: 服务器 端:套接字创建函数 Socket(),端口绑定函数 Bind(),套接口监听函数 Listen(),接受连接函数 Accept(),数据收发函数 Read()和 Write(),以及套接口关闭函数 Close()。 客户端:套接口创建函数 Socket(),套接口连接函数 Connect(),数据收发函数 Read()和 Write(),以及套接口关闭函数 Close()。 首先运行 服务器端 程序,通过 Socket()函数会建立一个套接字,然后通过 Bind()函数绑定一个端口,然后 调用 Listen()在套接字指定的端口上开始倾听,利用 Accept()从完全建立连接的队列中接受一个连接,连接获得后使用 Read()和 Write()函数进行通信。 通信结束后调用 Close()关闭套接字描述符。 运行客户端的程序,调用 Socket()函数建立一个套接字,使用 Connect()函数与服务器端进行连接,连接完成后,使用 Write()和 Read()与服务器端进行通信,通信结束后调用 close()关闭套接字描述符。 《基于 Linux 网络聊天室的设计 》 第 10 页 共 21 页 4 系统实现 相关函数 (1)Socket() 作用: socket 函数 为客户机或服务器创建一个 sokcet 格式: int socket(int family,int type,int protocol)。 参数说明: Family:表示地址族,可以去 AF_UNLX 和 AF_INT。 其中, AF_UNLX 只能够用于单一的 UNIX 系统进程间通信。 AF_INT 是针对 Inter 的,因而可以允许在远程主机之间通信,实验中使用 AF_INT。 Type:网络程序所采用的通信协议,可以取 SOCK_STREAM 或 SOCK_DGRAM。 其中,SOCK_STREAM 表明使用的是 TCP 协议,这样提供按顺序、可靠、双向、面向连接的比特流;SOCKE_DGRAM 表明使用的是 UDP 协议,这样只会提供定长、不可靠、无连接的通信。 (2)bind( ) 格式: int bind(int sockfd,struct sockaddr *addr,int addrlen)。 参数说明: Sockfd: socket 的文件描述符号。 Sockaddr:表示名 字所用的一个数据结构,用来保存地址 (包括 IP 地址和端口 ) Addrlen:设置结构大小长度。 (3)listen() 格式: int listen(int sockfd, int backlog)。 作用:监听连接信号,和 accepted 函数合同。 参数说明: Sockfd:表示 socket 调用返回的文件描述符。 Backlog:表示接入队列允许的连接数目,大多数系统允许 20 个,也可以子定义 5~ 10 个。 (4)accept() 格式: 《基于 Linux 网络聊天室的设计 》 第 11 页 共 21 页 Int accept (int sockfd, void *addr, int *addrlen)。 作用:与 listen 函数合用,监听信息、接收客户端请求。 参数说明: Sockfd:表示 socket 的文件描述符。 Addr:表示指向局部的数据结构 struct sockaddrin 的指针。 Addrlen:表示地址的长度。 (5)connect() 格式: int connect( int sockfd , struct sockaddr *serv_addr , int addrlen)。 作用:在面向 连接的系统中客户及连接服务器时使用, connect 必须在 bind 后使用。 参数作用: Sockfd:表示 socket 的文件描述符。 Servaddr:表示村访目的端口和 ip 地址(套接字)的数据结构。 (6)send() 和 recv() 格式 1: Int send (int sockfd, const vod *msg,int len, int flags)。 功能:发送信息。 格式 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)。 参数。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。