//以下代码仅供参考,如有错误请评论指正,谢谢!
//服务端
server.c
#include "myhead.h" //所需要的所有头文件(除内核链表外)
#include "kernel_list.h"//内核链表头文件
//定义一个互斥锁
pthread_mutex_t m;
//设计客户端节点
struct client
{
char ip[50]; //存客户端ip
unsigned int port; //存客户端端口
int connfd; //存客户端连接套接字
struct list_head list; //定义内核链表
};
//链表头节点
struct client *head = NULL;
//初始化头节点
struct client *list_init(void)
{
struct client *head = calloc(1, sizeof(struct client));
if(head == NULL)
{
perror("calloc failed");
exit(0);
}
INIT_LIST_HEAD(&head->list);
}
//单发(发给指定的人)
bool send_single(char *msg, unsigned short port)
{
struct list_head *pos = NULL;
struct client *tmp = NULL;
//对共享资源加锁
pthread_mutex_lock(&m);
list_for_each(pos, &head->list)
{
//找出pos指向的链表节点所在的结构体类型的结构体首地址,list是struct client类型的结构体成员
tmp =list_entry(pos, struct client, list);
if(tmp->port == port)
{
write(tmp->connfd, msg, strlen(msg));
pthread_mutex_unlock(&m); //异常情况,先解锁,再退出
return true;
}
}
pthread_mutex_unlock(&m); //正常退出,解锁
return false;
}
//群发
void send_broadcast(char *msg, struct client* new)
{
struct list_head *pos = NULL;
struct client *tmp = NULL;
//对共享资源加锁
pthread_mutex_lock(