Linux下Socket网络编程之点对点聊天室
1. 系统设计的目的与意义
掌握信号与信号处理的概念,了解点对点聊天室的设计需求,掌握相关的理论知识,切实掌握程序设计的分析方法,勇于实践,多参考开源项目和代码。实现点对点聊天室程序设计,Linux网络程序设计在服务器领域、嵌入式领域有着广泛的应用。
2. 系统开发环境
(1)VMware Workstation 7.0
(2)Red Hat Enterprise Linux 5
(3)硬件:每人一台计算机并能够连入局域网
(4) 软件:Windows xp/7 c语言
3. 使用的相关技术
Linux系统下使用C语音进行编程
(1)Linux它是一个类UNIX内核的可以自由发布的实现版本,一个操作系统的底层核心。完整的Linux系统=内核+外围工具,可以获得内核源代码,编译并安装,然后获得并安装许多其他自由发布的软件,从而创建一个完整的Linux,通常称为Linux系统。
缺点:操作困难、工具软件和开发软件版本太多,不易选择。
优点:开放性的、多用户多任务的系统,具有出色的稳定性、速度性能、可靠的系统安全性,提供了丰富的网络功能、良好的用户界面,标准兼容性和可移植性。
(2)C语音是一种计算机程设计序语言,它既有高级语言的特点又有汇编语言的特点。它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖于计算机硬件的应用程序。
(3)C/S(Client/Server)或客户端/服务器结构模式:建立在局域网的基础上。客户机响应速度快但只应用于局域网,客户需要安装专用的客户端软件但应用程序的升级和客户端程序的维护相对困难。
二、需求分析
1.点对点聊天室系统示意图
2.系统的基本功能
(1)服务器:
• 接受客户端发送过来的数据并显示
• 接受键盘输入的数据,并发送给客户端
• 客户端关闭,服务器端的进程也将全部退出。
(2)客户端:
• 接受服务器发送过来的数据并显示
• 接受键盘输入的数据,并发送给服务器
• 服务器关闭,客户端的进程也将全部退出。
三、概要设计
1.socket函数
• 包含头文件<sys/socket.h>
• 功能:创建一个套接字用于通信
• 原型
– int socket(int domain, int type, int protocol);
• 参数
– domain :指定通信协议族(protocol family)
– type:指定socket类型,流式套接字SOCK_STREAM,数据报套接字SOCK_DGRAM,原始套接字SOCK_RAW
– protocol :协议类型
• 返回值:成功返回非负整数, 它与文件描述符类似,我们把它称为套接口描述字,简称套接字。失败返回-1
2.bind函数
• 包含头文件<sys/socket.h>
• 功能:绑定一个本地地址到套接字
• 原型
- int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
• 参数
– sockfd:socket函数返回的套接字
– addr:要绑定的地址
– addrlen:地址长度
• 返回值:成功返回0,失败返回-1
3.listen函数
• 包含头文件<sys/socket.h>
• 功能:将套接字用于监听进入的连接
• 原型
- int listen(int sockfd, int backlog);
• 参数
– sockfd:socket函数返回的套接字
– backlog:规定内核为此套接字排队的最大连接个数
• 返回值:成功返回0,失败返回-1
4.accept函数
• 包含头文件<sys/socket.h>
• 功能:从已完成连接队列返回第一个连接,如果已完成连接队列为空,则阻塞。
• 原型
-int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
• 参数
– sockfd:服务器套接字
– addr:将返回对等方的套接字地址
– addrlen:返回对等方的套接字地址长度
• 返回值:成功返回非负整数,失败返回-1
5.connect函数
• 包含头文件<sys/socket.h>
• 功能:建立一个连接至addr所指定的套接字
• 原型
-int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
• 参数
– sockfd:未连接套接字
– addr:要连接的套接字地址
– addrlen:第二个参数addr长度
• 返回值:成功返回0,失败返回-1
6.write函数
• 包含头文件<unistd.h>
• 功能:向文件输出数据
• 原型
-ssize_t write(int fd,const void *buf,size_t nbytes)
• 参数
– fd:数据传输对象的文件描述符
– addr:保存要传输数据的缓冲地址值
– addrlen:要传输数据的字节数
• 返回值:成功返回写入的字节数,失败返回-1
7.read函数
• 包含头文件<unistd.h>
• 功能:用来接收数据
• 原型
-ssize-t read(int fd,void *buf,size_t nbytes);
• 参数
– fd:显示数据接收对象的文件描述符
– buf:要保存接收数据的缓冲地址值
– nbytes:要接收数据的最大字节数
• 返回值:成功返回接收的字节数,失败返回-1
8.close函数
• 包含头文件<unistd.h>
• 功能: 关闭文件或套接字
• 原型
-int close(int fd);
• 参数
– fd:需要关闭的文件或套接字的文件描述符
• 返回值:成功返回0,失败返回-1
9.fgets函数
• 包含头文件<stdio.h>
• 功能: 从文件流中读取一行或指定个数的字符
• 原型
-char *fgets(char *string,int size,FILE *stream);
• 参数
– string:字符数组,用来保存读取到的字符
– size:要读取的字符的个数,如果该行字符数大于size-1,则读到size-1个字符时结束,并在最后补充‘\0’;如果该行字符数小于等于size-1,则读取所有字符,并在最后补充‘\0’。
– stream :文件流指针
• 返回值:读取成功,返回读到的字符串,即string;失败返回NULL。
10.fputs函数
• 包含头文件<stdio.h>
• 功能:将指定的字符串写入到文件流中
• 原型
-int fputs(char *string,FILE *stream);
• 参数
– string:为将要写入的字符串
– stream:文件流指针
• 返回值:成功返回非负数,失败返回EOF
11.handler函数
• 包含头文件<stdio.h>
• 功能:特定事件发生时,操作系统向进程发送信息
• 原型
-void handler(int sig)
• 返回值:参数类型为int型,返回void型函数
12.signal函数
• 包含头文件<signal.h>
• 功能:获取系统产生各种信号并对此信号调用用户自己定义
• 原型
-void (* signal(int signo,void (*func)(int)))(int)
• 参数
– 第一个参数:指定信号的值
– 第二个参数:一个函数指针,用于指定针对信号的处理函数的函数内存空间地址
• 返回值:参数类型为int型,返回void型函数指针
13.fork函数
• 包含头文件<unistd.h>
• 功能:把Linux 变换为多任务系统的基础
• 原型
-pid_t fork(void)
• 返回值:成功时返回进程ID,失败时返回-1
14.kill函数
• 包含头文件<signal.h>
• 功能:发送指定的信号到相应进程
• 原型
-int kill(pid_t,int sig)
• 参数
– pid_t:参数进程标识号
– sig:进程号要传递信号值
• 返回值:成功返回0,失败返回-1