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

📄 server.c

📁 linux写的基于epoll技术的通信服务器
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#include <unistd.h>#include <netdb.h>#include <sys/stat.h>#include <arpa/inet.h>#include <sys/time.h>#include <sys/resource.h>#include <mysql.h>#include <public.h>#include <sys/epoll.h>#include "pthread.h"#include "server.h"//#include <syslog.h>#define MAXEPOLLSIZE 10000#define THREAD_MAX 10#define SERVER_IP "192.168.1.200"#define SERVER_PORT 9000typedef struct {    char ip4[128];    int port;    int fd;}LISTEN_INFO;static LISTEN_INFO s_listen;static unsigned int s_thread_para[THREAD_MAX][8];static pthread_t s_tid[THREAD_MAX];static MYSQL s_mysql[THREAD_MAX];pthread_mutex_t s_mutex[THREAD_MAX];static int init_thread_pool(void);static int init_mysql_conn_pool(void);static int init_listen4(char *ip4,int port,int max_link);int vercmp(char * s1,char * s2){    int i;    if (strlen(s1)<strlen(s2))	return (-1);    else if(strlen(s1)>strlen(s2))	return (1);    else    {	for(i=0;i<strlen(s1);i++)	{	    if((*s1)<(*s2)) {		return (-1);	    }	    else if((*s1)>(*s2)){	        return (1);	    }	    s1++;	    s2++;	}	return (0);    }}int query_conf_file(char * buf , const char * conf_filename , const char * section_str){    FILE * conf_file;    char tpstr[300]="";    char section[30]="";    conf_file=fopen(conf_filename,"r");    if(NULL!=conf_file)    {	while(fgets(tpstr,sizeof(tpstr),conf_file))	{	    sscanf(tpstr,"%s %s",section,buf);	    if(0==strcmp(section_str,section)) break;	}	fclose(conf_file);	return (0);    }else    {	lprintf(logd,ERROR,"open file %s fault!",conf_filename);    }    return (-1);}int do_db_write_work(MYSQL *p_mysql,char * sqlstr){    int res;    res=mysql_query(p_mysql,sqlstr);    if (res)    {        lprintf(logd,ERROR,"database operate error with sql:%s\n",sqlstr);	return (-1);    }     return (0);}int query_soft_ver(char * buf){    return query_conf_file(buf ,"lfsys.conf","soft_ver");}int query_soft_path(char * buf){    return query_conf_file(buf,"lfsys.conf","soft_path");}int set_curr_client_soft_ver(MYSQL *p_mysql,char * ver,char * client_id){    char sqlstr[250]="";    sprintf(sqlstr,"update edi_client set curr_client_soft_ver=%s where id=%s",ver,client_id);    return do_db_write_work(p_mysql,sqlstr);}int query_mat_ver(MYSQL * p_mysql,char * buf, char * build_id){    MYSQL_RES * result;    MYSQL_ROW row;    char sqlstr[250]="";    sprintf(sqlstr,"select mat_ver from edi_build where id=%s",build_id);    if(0!=mysql_real_query(p_mysql,sqlstr,strlen(sqlstr)))    {	lprintf(logd,ERROR,"Error in query:%s\n",mysql_error(p_mysql));	return (-1);    }    result=mysql_store_result(p_mysql);    if (1!=(mysql_num_rows(result)))    {	lprintf(logd,ERROR,"query error,result number not unique!");	return (-1);    }    row=(mysql_fetch_row)(result);    sprintf(buf,"%s",row[0]);    mysql_free_result(result);    return (0);}int query_mat_path(MYSQL *p_mysql,char * buf , char * build_id){    MYSQL_RES * result;    MYSQL_ROW row;    char sqlstr[250]="";    sprintf(sqlstr,"select mat_path from edi_build where id=%s",build_id);    if(0!=mysql_real_query(p_mysql,sqlstr,strlen(sqlstr)))    {	lprintf(logd,ERROR,"Error in query:%s\n",mysql_error(p_mysql));	return (-1);    }    result=mysql_store_result(p_mysql);    if (1!=(mysql_num_rows(result)))    {	lprintf(logd,ERROR,"query error,result number not unique!");	return (-1);    }    row=(mysql_fetch_row)(result);    sprintf(buf,"%s", row[0]);    mysql_free_result(result);    return (0);}int set_curr_client_mat_ver(MYSQL * p_mysql,char * ver,char * client_id){    char sqlstr[250]="";    sprintf(sqlstr,"update edi_client set curr_client_mat_ver=%s where id=%s",ver,client_id);    return do_db_write_work(p_mysql,sqlstr);}int query_client_refuse_list_ver(MYSQL *p_mysql,char * buf , char * client_id){    MYSQL_RES * result;    MYSQL_ROW row;    char sqlstr[250]="";    sprintf(sqlstr,"select refuse_list_ver from edi_client where id=%s",client_id);    if(0!=mysql_real_query(p_mysql,sqlstr,strlen(sqlstr)))    {	lprintf(logd,ERROR,"Error in query:%s\n",mysql_error(p_mysql));	return (-1);    }    result=mysql_store_result(p_mysql);    if (1!=(mysql_num_rows(result)))    {	printf("query error!");	return (-1);    }    row=(mysql_fetch_row)(result);    sprintf(buf,"%s", row[0]);    mysql_free_result(result);    return 0;}int query_client_refuse_list(MYSQL *p_mysql,char * buf , char * client_id){    MYSQL_RES * result;    MYSQL_ROW row;    char sqlstr[250]="";    sprintf(sqlstr,"select refuse_list from edi_client where id=%s",client_id);    if(0!=mysql_real_query(p_mysql,sqlstr,strlen(sqlstr)))    {	lprintf(logd,ERROR,"Error in query:%s\n",mysql_error(p_mysql));	return (-1);    }    result=mysql_store_result(p_mysql);    if (1!=(mysql_num_rows(result)))    {	lprintf(logd,ERROR,"query error,result not unique!");	return (-1);    }    row=(mysql_fetch_row)(result);    sprintf(buf,"%s", row[0]);    mysql_free_result(result);    return (0);}int set_curr_client_refuse_list_ver(MYSQL *p_mysql,char * ver,char * client_id){    char sqlstr[250]="";    sprintf(sqlstr,"update edi_client set curr_client_refuse_list_ver=%s where id=%s",ver,client_id);    return do_db_write_work(p_mysql,sqlstr);}int query_client_cmd_shell_ver(MYSQL *p_mysql,char * buf,char * client_id){    MYSQL_RES * result;    MYSQL_ROW row;    char sqlstr[250]="";    sprintf(sqlstr,"select client_cmd_shell_ver from edi_client where id=%s",client_id);    if(0!=mysql_real_query(p_mysql,sqlstr,strlen(sqlstr)))    {	lprintf(logd,ERROR,"Error in query:%s\n",mysql_error(p_mysql));	return (-1);    }    result=mysql_store_result(p_mysql);    if (1!=(mysql_num_rows(result)))    {	lprintf(logd,ERROR,"query error,result not unique!");	return (-1);    }    row=(mysql_fetch_row)(result);    sprintf(buf,"%s",row[0]);    mysql_free_result(result);    return (0);}int query_client_cmd_shell_path(MYSQL *p_mysql,char * buf,char * client_id){    MYSQL_RES * result;    MYSQL_ROW row;    int rownum;    char sqlstr[250]="";    sprintf(sqlstr,"select client_cmd_shell_path from edi_client where id=%s",client_id);    if(0!=mysql_real_query(p_mysql,sqlstr,strlen(sqlstr)))    {	lprintf(logd,ERROR,"Error in query:%s\n",mysql_error(p_mysql));	return (-1);    }    result=mysql_store_result(p_mysql);    rownum=mysql_num_rows(result);    if (1!=rownum)    {	lprintf(logd,ERROR,"query error,result not unique!");	return (-1);    }    row=(mysql_fetch_row)(result);    sprintf(buf,"%s",row[0]);    mysql_free_result(result);    return (0);}int set_curr_client_cmd_shell_ver(MYSQL *p_mysql,char * ver,char * client_id){    char sqlstr[250]="";    sprintf(sqlstr,"update edi_client set curr_client_cmd_shell_ver=%s where id=%s",ver,client_id);    return do_db_write_work(p_mysql,sqlstr);}int set_client_online_ip_port_and_time(MYSQL *p_mysql,char * client_id,char * ip,int port){    char sqlstr[250]="";    sprintf(sqlstr,"update edi_client set ip=%s,port=%d,time=now() where id=%s",ip,port,client_id);    return do_db_write_work(p_mysql,sqlstr);}int do_check_soft_ver(const msg_client * msg,struct MSG_SERVER * p_to_client_msg,int * need_sendto_client){    char ver_in_client[50] = "",client_id[12] = "";    char ver_in_server[50] = "";    char soft_path[255] = "";    sprintf( ver_in_client,"%s",msg->ver );    sprintf( client_id,"%s",msg->head.terminal_id );    if (0 != (query_soft_ver(ver_in_server)))    {        lprintf(logd,ERROR,"client:'%s' query soft ver fault !\n",client_id);        return (-1);	    }    if (-1!=vercmp(ver_in_client,ver_in_server))    {	lprintf( logd,INFO,"client:'%s' not need update software !\n",client_id );	return (-1);    }    if (0!=(query_soft_path(soft_path)))    {	lprintf(logd,ERROR,"client:'%s' query software path fault !\n",client_id);	return (-1);    }    memcpy(&p_to_client_msg->head,&msg->head,sizeof(struct MSG_HEAD));    sprintf(p_to_client_msg->ver,"%s",ver_in_server);    p_to_client_msg->need_upt_soft=1;    sprintf(p_to_client_msg->path,"%s",soft_path);    *need_sendto_client=1;    return (0); }int do_check_mat_ver(MYSQL * p_mysql,const msg_client * msg,struct MSG_SERVER * p_to_client_msg,int * need_sendto_client){    char ver_in_client[50]="",client_id[12]="",client_build_id[12]="";    char ver_in_server[50]="";    char mat_path[255]="";    sprintf(ver_in_client,"%s",msg->ver);    sprintf(client_id,"%s",msg->head.terminal_id);    sprintf(client_build_id,"%s",msg->head.build_id);    if (0!=(query_mat_ver(p_mysql,ver_in_server,client_build_id)))    {	lprintf(logd,ERROR,"client:'%s' query mat ver fault !");	return (-1);    }    if (-1!=vercmp(ver_in_client,ver_in_server))    {#ifdef DEBUG	lprintf(logd,DEBUG,"client:'%s' not need update mat !");#endif	return (-1);    }    if(0!=(query_mat_path(p_mysql,mat_path,client_build_id)))    {	lprintf(logd,ERROR,"client:'%s' query mat path fault !");	return (-1);    }    memcpy(&p_to_client_msg->head,&msg->head,sizeof(struct MSG_HEAD));    p_to_client_msg->need_upt_mat=1;    sprintf(p_to_client_msg->path,"%s",mat_path);    *need_sendto_client=1;    return 0; }int do_check_refuse_list(MYSQL *p_mysql,const msg_client * msg,struct MSG_SERVER * p_to_client_msg,int * need_sendto_client)

⌨️ 快捷键说明

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