10.网络打印DEBUG信息

博客对debug_manager.c和net_print.c进行分析,包括开始定义的变量和函数。介绍了主函数的两个初始化流程,一是设备注册到链表,二是调用设备初始化函数。还说明了net_print初始化后接收线程的工作情况,以及客户端连接前后缓冲区内容的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.debug_manager.c分析

static PT_DebugOpr g_ptDebugOprHead;
static int g_iDbgLevelLimit = 8;

int RegisterDebugOpr(PT_DebugOpr ptDebugOpr);	//注册可供打印debug的设备
void ShowDebugOpr(void);						//显示一下有哪些设备
PT_DebugOpr GetDebugOpr(char *pcName);			//根据名字找设备的结构体指针

int SetDbgLevel(char *strBuf);					//设置打印等级,主要在网络接收线程中被调用
												//格式为 "strBuf = "dbglevel=6"

int SetDbgChanel(char *strBuf);					//设置通道的开和关,主要在网络接收线程中被调用
												//格式为 stdout=0 stdout=1 netprint=0 netprint=1	
												
int DebugPrint(const char *pcFormat, ...);		//所有DEBUG都指向这个函数
												//主要工作是,把输入进来的变参转换成字符串
												//判断字符串中是否有打印等级,若有,判断打印等级是否高于设置的打印等级
												//依次轮询链表中能用的打印设备,挨个打印字符串
												
/*这两个函数在主函数中调用,一开始就调用了,以便后面可以DEBUG*/
int DebugInit(void);							//调用所有打印设备的Init函数,用来向链表头注册
int InitDebugChanel(void);						//初始化打印通道
												//意思就是看链表里的打印设备如果isCanUse标志位都是1
												//并且初始化函数存在
												//就为每一个设备执行其自己的设备初始化函数

2.netprint.c分析

开始定义的变量分析

#define SERVER_PORT 5678				//服务器端口
#define PRINT_BUF_SIZE   (16*1024)		//环形缓冲区的大小设置

static int g_iSocketServer;						//服务器的socket句柄
static struct sockaddr_in g_tSocketServerAddr;	//服务器的IP地址
static struct sockaddr_in g_tSocketClientAddr;	//用来存放连接上来的客户端的IP地址
static int g_iHaveConnected = 0;				//是否有客户端成功连接的标志

static char *g_pcNetPrintBuf;//环形缓冲区的首地址
static int g_iReadPos  = 0;	//环形缓冲区读的位置
static int g_iWritePos = 0;	//环形缓冲区写的位置

/*收发线程的两个ID号*/
static pthread_t g_tSendTreadID;
static pthread_t g_tRecvTreadID;

/*线程间通信,定义的锁和一个什么东西*/
static pthread_mutex_t g_tNetDbgSendMutex  = PTHREAD_MUTEX_INITIALIZER;	//定义锁
static pthread_cond_t  g_tNetDbgSendConVar = PTHREAD_COND_INITIALIZER;	//定义唤醒的一个什么东西

函数分析

/*这四个是环形缓冲区的函数,详情看C语言类中的环形缓冲区的代码详解*/
static int isFull(void);
static int isEmpty(void);
static int PutData(char cVal);
static int GetData(char *pcVal);

/*发送线程的执行函数
 *1.通过NetDbgPrint函数唤醒
  2.如果 已经有客户端连接,并且 环形缓冲区不为空,那么就开始发送
  3.一次最多发送512个字节的数据,直到把缓冲区的数据发完
  4.上锁进睡眠等唤醒*/
static void *NetDbgSendTreadFunction(void *pVoid);
/*接收线程的执行函数
 *1.这条进程不进入睡眠
  2.阻塞等待接收数据
  3.如果收到的是"setclient",就表明客户端需要打印数据,就设置g_tSocketClientAddr,g_iHaveConnected
  4.如果收到的是"dbglevel=",就调用SetDbgLevel设置
  5.剩下的都丢给 SetDbgChanel去处理,格式不对就直接丢了,格式对了就处理*/
static void *NetDbgRecvTreadFunction(void *pVoid);

/*主要做三件事
 *1.设置服务器
 *2.挖一块内存给环形缓冲区
 *3.开两个线程给收发的*/
static int NetDbgInit(void);

/*关服务器,以及释放环形缓冲区*/
static int NetDbgExit(void);
/*net debug显示函数
 *先把数据一个字节一个字节放到环形缓冲区
 *然后告诉子线程,可以搞了*/
static int NetDbgPrint(char *strData);

int NetPrintInit(void); 		//注册函数

整个的流程:
主函数两个初始化,第一个是让各个设备注册到链表,第二个是看哪些设备能用,然后依次调用设备初始化函数。
net_print初始化好后,接收线程就在等待客户端的连接或者设置,在有客户端发送set_client之前,调用到DEBUG都会把字符串放到环形缓冲区中,最后有客户端连接后, 执行的第一次net_print,就会一次性把缓冲区的内容全部发送出去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值