Enrich your life today,. yesterday is history.tomorrow is mystery
充实今朝,昨日已成过去,明天充满神奇
TCP线程多路并发实现群聊功能
1、实现TCP_server与TCP_client的双向通信
学完了linux的系统编程,正好可以和本阶段的网络编程结合起来,实现一个好玩的功能,QQ群聊的功能,本次主要是利用TCP服务器和TCP客户端和线程多路并发的方式来实现。
实现步骤
群聊的功能实现原理很简单,在每服务器中每条监听客户端的线程中一旦有接收到数据,就转发给其他客户端。具体步骤如下:
- 1.建立TCP服务器与客户端的双向通信,再次基础上进行扩展。
- 2.建立一条保存每一个客户端信息的单向链表,链表每个节点包含客户端的socket描述符、IP地址、端口号、线程的pid。
- 3.access每收到一个客户端的连接申请时,就把客户端的信息形成一个结点,插入链表中,并创建一条线程用于接收当前客户端的消息,并根据链表的信息结点转发到其他客户端。
服务器就相当于一个搬运工,本篇章涉及的知识点前面的篇章也都涉及到,实现起来并不难。下面就跟我一起敲代码把。
1、实现TCP_server与TCP_client的双向通信
这一步如何实现已经完成了,就不再花时间介绍了,不明白的同学点击跳转。
2、初始化一条单向链表
2.1、定义链表的结点
根据上面的需求,需要包含客户端的描述符、IP地址、端口号、线程的pid这几个数据,也可以根据自身的情况进行定义。
typedef struct client_info{
int client_fd;//客户端的描述符
char ip[16];//IP地址
short port;//端口号
pthread_t tid;//当前线程的pid
struct client_info *next;
}client_info_node;
2.2、链表操作函数
为了方便链表的初始化、插入和遍历等,可以封装一系列的链表功能函数。
static client_info_node *request_client_info_node(const client_info_node *info)
{
client_info_node *new_node;
new_node = malloc(sizeof(client_info_node));
if(new_node == NULL)
{
perror("申请客户端节点异常");
return NULL;
}
if(info != NULL)
*new_node = *info;
new_node->next = NULL;
return new_node;
}
将结点插入链表:
static inline void insert_client_info_node_to_link_list(client_info_node *hea