简易Linux终端聊天室
必备Linux命令和C语言基础
http://www.makeru.com.cn/video/1876.html?s=69821
今天我们来实现一个简单的小项目,在这个项目中,我们将实现一个终端版的简易Linux聊天室。
实现的效果:服务器启动,监测客户端连接的个数,监测每个客户端的IP地址以及端口号,当每个客户端发送消息时,服务器上会有线程专门将每个客户端发送的信息记录在界面上,就类似平时使用QQ群聊一样。我们来看看这个简易的Linux聊天室如何来实现吧。如图4-5-12所示。
1、实现一个基本的服务器和客户端的步骤
一、创建服务器的流程
(1)调用socket函数创建一个套接口,并返回描述符。
(2)调用bind函数使服务器进程与一个端口号绑定。
(3)调用listen设置客户端如队列的大小。
(4)调用accept接收一个连接,如果接入队列不为空的话。并且相应返回一个已连接的套接口描述符。
(5)调用send和recv用来在已连接的套接口间进行发送和接收数据。
二、创建客户端流程
(1)调用socket函数创建一个套接口,并返回描述符。
(2)调用connect向服务器发送连接请求,返回一个已连接的套接口。
(3)调用send和recv在已连接的套接口间发送和接收数据。
1.1服务器将要完成的工作
(1)获取套接字
(2)设置端口复用
(3)绑定连接的IP还有端口号
(4)监听
(5)创建一条线程用于显示客户端连接信息,具体连接的人数,顺便将客户连接的IP以及端口号打印出来。
(6)开始接收
(7)创建一条线程用于将客户端直接收发的信息分发到客户端处进行显示。
下面具体看看服务器代码的实现 server.c
1#include <stdio.h>
2#include <unistd.h>
3#include <sys/socket.h>
4#include <netinet/in.h>
5#include <netinet/ip.h>
6#include <string.h>
7#include <pthread.h>
8#include <sys/time.h>
9//设置客户端最大的个数为40个
10#define MAXCONNECTION 40
11#define msleep(x) (usleep(x*1000))
12struct Data
13{
14 int live ; //0 无人用 1有人用
15 int sockfd ;
16 struct in_addr in ;
17 unsigned short port ;
18};
19
20struct Data array[MAXCONNECTION] = {
0} ;
21void *do_thread_showconnect(void *arg);
22void *do_thread_clientopt(void *arg);
23int main(void)
24{
25 int sockfd ;
26 //1.获取套接字
27 sockfd = socket(AF_INET , SOCK_STREAM , 0);
28 if(sockfd < 0)
29 {
30 perror("get socket fail");
31 return -1 ;
32 }
33 //2.设置端口复用
34 int on = 4 ;
35 setsockopt(sockfd , SOL_SOCKET , SO_REUSEADDR , &on , sizeof(int));
36 //3.绑定IP与端口
37 struct sockaddr_in addr ;
38 addr.sin_family = AF_INET ;
39 addr.sin_port = htons(10086);
40 //设置为INADDR_ANY,表示监听所有的。
41 addr.sin_addr.s_addr = INADDR_ANY ;
42 int ret ;
43 ret = bind(sockfd , (struct sockaddr *)&addr , sizeof(struct sockaddr_in)) ;