完成TCP转发服务器(内核链表+互斥锁)

//以下代码仅供参考,如有错误请评论指正,谢谢!

//服务端
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(
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖小邓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值