⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rc_ctl_table.c

📁 epoll机制的收发程序 只能在2.6内核上使用
💻 C
📖 第 1 页 / 共 2 页
字号:
LAB_RETURN:
	return ret;
}

/*
 * 功  能:删除所有的链接
 * 参  数:head:链接队列的头指针
 * 返回值:直接返回0
 */
int rc_del_connection_all(struct_msg_con **head)
{
	struct_msg_con	*tmp;
	
	if(*head == NULL)
	{
		goto LAB_RETURN;
	}
	
	while(1)
	{
		tmp = (*head)->next;
		close((*head)->sockfd);
		pthread_mutex_lock(&(tmp->mutex_opt));
		if(tmp->rcv.buf != NULL)
		{
			free((*head)->rcv.buf);
			(*head)->rcv.buf = NULL;
		}
		free(*head);
		*head = tmp;
		if(tmp == NULL)
		{
			break;
		}
	}
	*head = NULL;
LAB_RETURN:
	return 0;
}

/*
 * 功  能:根据sockfd从链接信息的链表中获取摄像机的相关链接信息
 * 参  数:sockfd:socket的id
 *         head:链接信息链表的头指针
 * 返回值:成功返回链接信息的指针,否则返回空指针
 */
struct_msg_con *rc_get_lnk_cam(struct_msg_con *head, int sockfd)
{
	struct_msg_con		*ret = NULL;
	
	if(sockfd < 0)
		return NULL;
	ret = head;
	while(1)
	{
		if(ret == NULL)
			break;
		if(ret->sockfd == sockfd)
		{
			break;
		}
		ret = ret->next;
	}
	
	return ret;
}

/*
 * 功  能:根据sockfd从链接信息的链表中获取控件的相关链接信息
 * 参  数:sockfd:socket的id
 *         head:链接信息链表的头指针
 * 返回值:成功返回链接信息的指针,否则返回空指针
 */
struct_msg_atx *rc_get_lnk_atx(struct_msg_atx *head, int sockfd)
{
	struct_msg_atx		*ret = NULL;
	
	if(sockfd < 0)
		return NULL;
	ret = head;
	while(1)
	{
		if(ret == NULL)
			break;
		if(ret->sockfd == sockfd)
		{
			break;
		}
		ret = ret->next;
	}
	
	return ret;
}


/*
 * 功  能:向已经发送成功的任务队列中添加任务
 * 参  数:head:任务队列的头指针
 *         newtask:新的任务的指针
 * 返回值:成功返回0,否则返回-1
 * 说  明:是将newtask的地址添加到任务队列尾,不对task做任何操作,
 *         newtask必须是一个临时分配的内存区
 */
int rc_add_task_sended(struct_task_sended **head, struct_task_sended *newtask)
{
	struct_task_sended	*tmp;
	
	if(newtask != NULL)
		newtask->next = NULL;
	else
		return 0;
	
	newtask->createtime = rc_sec_now();
	if((*head) == NULL)
	{
		*head = newtask;
	}
	else
	{
		tmp = *head;
		while(1)
		{
			if(tmp->next == NULL)
			{
				newtask->next = NULL;
				tmp->next = newtask;
				break;
			}
			tmp = tmp->next;
		}
	}
	
	return 0;
}

/*
 * 功  能:根据进程的pid来删除已经发送过的任务
 * 参  数:pid:进程id
 * 返回值:成功返回0,没有这个pid返回-1
 */
int rc_task_del_sended(struct_task_sended **head, pid_t pid)
{
	int						ret;
	struct_task_sended		*tmp;
	struct_task_sended		*tmp_l;
	
	ret = 0;
	if(*head == NULL)
	{
		goto LAB_RETURN;
	}
	
	tmp = *head;
	if(tmp->oldtask->pid == pid)
	{
		*head = tmp->next;
		free(tmp);
		ret = 1;
		goto LAB_RETURN;
	}
	else
	{
		while(1)
		{
			tmp_l = tmp;
			tmp = tmp->next;
			if(tmp == NULL)
			{
				break;
			}
			if(tmp->oldtask->pid == pid)
			{
				tmp_l->next = tmp->next;
				free(tmp);
				ret = 1;
				goto LAB_RETURN;
			}
		}
	}
LAB_RETURN:
	return ret;
}


/*
 * 功  能:删除已经发送成功的任务的队列
 * 参  数:head:任务队列的头指针
 * 返回值:直接返回0
 */
int rc_del_task_sended_all(struct_task_sended **head)
{
	struct_task_sended	*tmp_1;
	struct_task_sended	*tmp_2;
	
	tmp_1 = *head;
	if(tmp_1 == NULL)
	{
		return 0;
	}
	
	while(1)
	{
		tmp_2 = tmp_1->next;
		free(tmp_1);
		tmp_1 = tmp_2;
		if(tmp_1 == NULL)
		{
			break;
		}
	}
	
	return 0;
}


/*
 * 功  能:根据进程的pid来保存任务
 * 参  数:task:已经发送成功的任务队列的头指针
 *         pid:进程id
 *         serial:摄像机序列号
 *         mysql:链接好的数据库
 * 返回值:成功返回0,否则返回-1
 * 说  明:是保存信息至数据库
 */
int rc_task_save_sended(struct_task_sended *task, pid_t pid, const unsigned char *serial, struct_lab_mysql *lab_mysql)
{
	int						res;
	unsigned char			type;
	unsigned char			*data;
	struct_task_sended		*now;
	
	now = task;
	while(1)
	{
		if(now == NULL)
			break;
		if(now->oldtask->pid == pid)
		{
			if(now->oldtask->eventtype == TYPE_REQUEST_CTL)
				return 0;
			type = now->oldtask->msg.web.action;
			data = (unsigned char *)&(now->oldtask->msg.web.web);
			res = rc_save_mysql_web(TYPE_ACTION_CGI, serial, type, data, lab_mysql, now->logintime);
			if(res < 0)
			{
				return -1;
			}
			return 0;
		}
		else
			now = now->next;
	}
	
	return -1;
}


/*
 * 功  能:根据摄像机的序列号获取摄像机的在线信息
 * 参  数:serial:摄像机序列号
 *         head:链接信息链表的头指针
 *         cam:摄像机的相关链接信息
 * 返回值:如果摄像机在线返回0,否则返回-1
 * 说  明:是否要加互斥锁要视具体情况而定
 *         以最后链接上来的那个链接为准
 */
int rc_get_info_cam(const unsigned char *serial, struct_msg_con *head, struct_info_link *cam)
{
	int					res;
	int					ret;
	struct_msg_con		*tmp;
	
	tmp = head;
	ret = -1;
	
	while(1)
	{
		if(tmp == NULL)
			break;
		res = strcmp(tmp->serial, serial);
		if((res == 0) && (tmp->type == TYPE_CONNECT_CAM))
		{
			bzero(cam, sizeof(struct_info_link));
			strcpy(cam->serial, tmp->serial);
			cam->type = tmp->type;
			cam->sockfd = tmp->sockfd;
			cam->logintime = tmp->logintime;
			memcpy(&(cam->address), &(tmp->address), sizeof(struct sockaddr_in));
			ret = 0;
		}
		tmp = tmp->next;
	}
	
#ifdef		DEBUG_MYL
	printf("%s %d Serial : %s ; IP : %s ; Ret : %d\n\n", __FILE__, __LINE__, cam->serial, inet_ntoa(cam->address.sin_addr), ret);
#endif
	
	return ret;
}

/*
 * 功  能:根据摄像机的序列号获取摄像机的内网信息
 * 参  数:serial:摄像机序列号
 *         head:链接信息链表的头指针
 *         cam:摄像机的相关内网信息
 * 返回值:如果摄像机在线返回0,否则返回-1
 * 说  明:是否要加互斥锁要视具体情况而定
 *         以最后链接上来的那个链接为准
 */
int rc_get_cam_local(const unsigned char *serial, struct_msg_con *head, struct_cam_local *cam)
{
	int					res;
	int					ret;
	struct_msg_con		*tmp;
	
	tmp = head;
	ret = -1;
	
	while(1)
	{
		if(tmp == NULL)
			break;
		res = strcmp(tmp->serial, serial);
		if((res == 0) && (tmp->type == TYPE_CONNECT_CAM))
		{
			bzero(cam, sizeof(struct_cam_local));
			memcpy(cam, &(tmp->local), sizeof(struct_cam_local));
			ret = 0;
		}
		tmp = tmp->next;
	}
	
#ifdef		DEBUG_MYL
//	printf("%s %d Serial : %s ; IP : %s ; Ret : %d\n\n", __FILE__, __LINE__, serial, inet_ntoa(cam->ip), ret);
#endif
	
	return ret;
}

/*
 * 功  能:根据摄像机的序列号获取所有信息
 * 参  数:serial:摄像机序列号
 *         head:链接信息链表的头指针
 *         type:链接类型
 *         cam:摄像机的所有相关信息
 * 返回值:如果摄像机在线返回0,否则返回-1
 * 说  明:是否要加互斥锁要视具体情况而定
 *         以最后链接上来的那个链接为准
 */
int rc_get_msg_all(const unsigned char *serial, struct_msg_con *head, unsigned char type, struct_msg_con *cam)
{
	int					res;
	int					ret;
	struct_msg_con		*tmp;
	
	tmp = head;
	ret = -1;
	
	while(1)
	{
		if(tmp == NULL)
			break;
		res = strcmp(tmp->serial, serial);
		if((res == 0) && (tmp->type == type))
		{
			bzero(cam, sizeof(struct_msg_con));
			memcpy(cam, (tmp), sizeof(struct_msg_con));
			ret = 0;
		}
		tmp = tmp->next;
	}
	
	return ret;
}

/*
 * 功  能:向控件的链接链表中添加一个新的控件链接
 * 参  数:head:链表队列的头指针
 *         newcon:新的链接的指针
 * 返回值:成功返回0,否则返回-1
 * 说  明:是将newcon的地址添加到任务队列尾,不对task做任何操作,
 *         newcon必须是一个临时分配好的内存区
 */
int rc_add_atx(struct_msg_atx **head, struct_msg_atx *newcon)
{
	struct_msg_atx	*tmp;
	
	if(newcon != NULL)
		newcon->next = NULL;
	else
		return 0;
	
	if((*head) == NULL)
	{
		*head = newcon;
	}
	else
	{
		tmp = *head;
		while(1)
		{
			if(tmp->next == NULL)
			{
				newcon->next = NULL;
				tmp->next = newcon;
				break;
			}
			tmp = tmp->next;
		}
	}
	
	return 0;
}

/*
 * 功  能:从控件链接链表中删除一个控件
 * 参  数:head:链表队列的头指针
 *         sockfd:控件的socket的id
 * 返回值:成功返回1,找不到相匹配的链接返回0,失败返回-1
 * 说  明:删除的时候已经将sockfd关闭
 */
int rc_del_atx_one(struct_msg_atx **head, int sockfd)
{
	int					ret;
	struct_msg_atx		*tmp;
	struct_msg_atx		*tmp_l;
	
	ret = 0;
	if(*head == NULL)
	{
		goto LAB_RETURN;
	}
	
	tmp = *head;
	if(tmp->sockfd == sockfd)
	{
		pthread_mutex_lock(&(tmp->mutex_opt));
		close(sockfd);
		*head = tmp->next;
		
		if(tmp->rcv.buf != NULL)
		{
			free(tmp->rcv.buf);
			tmp->rcv.buf = NULL;
		}
		free(tmp);
		ret = 1;
		goto LAB_RETURN;
	}
	else
	{
		while(1)
		{
			tmp_l = tmp;
			tmp = tmp->next;
			if(tmp == NULL)
			{
				break;
			}
			if(tmp->sockfd == sockfd)
			{
				tmp_l->next = tmp->next;
				pthread_mutex_lock(&(tmp->mutex_opt));
				close(sockfd);
				if(tmp->rcv.buf != NULL)
				{
					free(tmp->rcv.buf);
					tmp->rcv.buf = NULL;
				}
				free(tmp);
				ret = 1;
				goto LAB_RETURN;
			}
		}
	}
LAB_RETURN:
	return ret;
}

/*
 * 功  能:根据sockfd从控件链接链表中找到这个控件的其它相关信息
 * 参  数:head:链表队列的头指针
 *         sockfd:控件的socket的id
 *         atx:要查找的控件的信息
 * 返回值:成功返回1,找不到相匹配的链接返回0,失败返回-1
 * 说  明:删除的时候已经将sockfd关闭
 */
int rc_info_atx(struct_msg_atx *head, int sockfd, struct_msg_atx *atx)
{
	int					ret;
	struct_msg_atx		*tmp;
	
	ret = 0;
	tmp = head;
	
	while(1)
	{
		if(tmp == NULL)
		{
			ret = 0;
			break;
		}
		if(tmp->sockfd == sockfd)
		{
			bzero(atx, sizeof(struct_msg_atx));
			memcpy(atx, tmp, sizeof(struct_msg_atx));
			atx->next = NULL;
			ret = 1;
			break;
		}
		tmp = tmp->next;
	}
	
	return ret;
}









⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -