📄 rc_ctl_table.c
字号:
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 + -