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

📄 smgw.c

📁 基于上海电信 sgmp3.0短信协议,实现的源程序,现网运行稳定,unix (freeBSD) 环境下编程.
💻 C
字号:
/*$Header: /base/cvsroot/wam/sms/platform/src/smgp3/smgw.c,v 1.4 2007/07/18 08:29:25 haowen Exp $*/
#include <stdio.h>
#include <sys/time.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <mysql.h>
#include <mysqld_error.h>
#include <errno.h>
#include "smgw.h"
#include "mylog.h"

extern char logfile[256];
extern int errno;

void getday(char *const day)
{
    struct tm *tp;
    time_t timep;

    time(&timep);
    tp=localtime(&timep);

    sprintf(day,"%d%02d%02d",(tp->tm_year+1900),( 1+tp->tm_mon), tp->tm_mday);
}

void getdatetime (char *const datetime)
{
    	struct tm *tp;
    	time_t timep;

    	time(&timep);
    	tp=localtime(&timep);

	sprintf(datetime,"%d-%02d-%02d %02d:%02d:%02d", (tp->tm_year+1900),( 1+tp->tm_mon), tp->tm_mday ,tp->tm_hour, tp->tm_min, tp->tm_sec);
}



void WriteMessagetolog(SEND_Q send)
{
    char content[256];
    char pi[1024];
    char mi[1024];
    char buffer[2048];

    mysql_escape_string(content, send.sq_sms_content, strlen(send.sq_sms_content)) ;
    mysql_escape_string(pi, send.sq_desc_pi, send.length_pi);
    mysql_escape_string(mi, send.sq_desc_mi, send.length_mi);
    sprintf(buffer, "insert into send_q_tmp values(%d,'%s',%d,'%s','%s','%s',%d,'%s','%s','%s','%s','%s','%s','%s','%d','%s','%s','%s','%s','%s',now(),'%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')",
             send.sq_id, 
            send.sq_service_code,
            send.sq_pri,
            send.sq_message_format,
            send.sq_fee_type,
            send.sq_fee_code,
            send.sq_sms_length,
            content,
            send.sq_content_type,
            pi,
            mi,
            send.sq_mobile,
            send.sq_send,
            send.sq_fee_mobile,
            send.sq_msg_type,
            send.sq_content_name,
            send.sq_content_id,
            send.sq_provider,
            send.sq_province,
            send.sq_sms_scheduletime,
      //      send->sq_send_time,
            send.sq_submit_id,
            "", /* send->sq_submit_stat, */
            send.sq_submit_time,
            send.sq_linkid,
            send.sq_jf_code,
            send.sq_product,
            send.sq_zone_province,
            send.sq_zone_city,
            send.sq_from,
            send.sq_wamid,
            send.sq_reg_cmd,
            send.sq_reg_gateway,
            send.sq_reg_from);
	INFO("[INFO-MAIN]BACKUP:  %s\n",buffer);
}



int HaveData(int socket_fd)
{
	fd_set recvset;
	struct timeval  timeout;
	int ret;
	
	/* Select Receive Set */
	FD_ZERO(&recvset);
	FD_SET(socket_fd, &recvset);
	timeout.tv_sec = 1;
	timeout.tv_usec = 100;
	again:
	if ( (ret = select(socket_fd + 1, &recvset, 0, 0, &timeout)) == -1 )
	{	
		INFO("[INFO-RECV:]errno = %d\n", errno);
		if(errno==EINTR) 
		{	
			INFO("[INFO-RECV:]errno = EINTR\n");
			goto again;
		}
		return -1;
	}
	else if(ret == 0)
	{
		//[HaveData]: time out
		return 0;
	}
	//HAVE DATA
	return ret;
	
}

void copy_send_q(SEND_Q *const send_q, MYSQL_ROW myrow)
{
    	memset(send_q, 0, sizeof(SEND_Q));
    	send_q->sq_id = atoi(myrow[0]);
    	send_q->length_pi = atoi(myrow[34]);
    	send_q->length_mi = atoi(myrow[35]);
//    strlcpy(send_q->sq_service_code, myrow[1], sizeof(send_q->sq_service_code));
    	strncpy(send_q->sq_service_code, myrow[1], sizeof(send_q->sq_service_code));
    	send_q->sq_service_code[sizeof(send_q->sq_service_code) -1] ='\0';
	
    	send_q->sq_pri = atoi(myrow[2]);
    	strncpy(send_q->sq_message_format, myrow[3], sizeof(send_q->sq_message_format));
    	send_q->sq_message_format[sizeof(send_q->sq_message_format) -1] ='\0';
	
    	strncpy(send_q->sq_fee_type, myrow[4], sizeof(send_q->sq_fee_type));
    	send_q->sq_fee_type[sizeof(send_q->sq_fee_type) -1] ='\0';
    	strncpy(send_q->sq_fee_code, myrow[5], sizeof(send_q->sq_fee_code));
    	send_q->sq_fee_code[sizeof(send_q->sq_fee_code) -1] = '\0';

    	send_q->sq_sms_length = atoi(myrow[36]);
    	strncpy(send_q->sq_sms_content, myrow[7], sizeof(send_q->sq_sms_content));
	send_q->sq_sms_content[sizeof(send_q->sq_sms_content) -1] = '\0';
	
    	strncpy(send_q->sq_content_type, myrow[8], sizeof(send_q->sq_content_type));
	send_q->sq_content_type[sizeof(send_q->sq_content_type)-1] ='\0';
	
    	memcpy(send_q->sq_desc_pi, myrow[9], send_q->length_pi);
    	memcpy(send_q->sq_desc_mi, myrow[10], send_q->length_mi);
    	strncpy(send_q->sq_mobile, myrow[11], sizeof(send_q->sq_mobile));
	send_q->sq_mobile[sizeof(send_q->sq_mobile)-1] ='\0';
	
    	strncpy(send_q->sq_send, myrow[12], sizeof(send_q->sq_send));
	send_q->sq_send[sizeof(send_q->sq_send) -1] ='\0';
	
    	strncpy(send_q->sq_fee_mobile, myrow[13], sizeof(send_q->sq_fee_mobile));
	send_q->sq_fee_mobile[sizeof(send_q->sq_fee_mobile)-1] ='\0';
	
    	send_q->sq_msg_type = atoi(myrow[14]);
    	strncpy(send_q->sq_content_name, myrow[15], sizeof(send_q->sq_content_name));
	send_q->sq_content_name[sizeof(send_q->sq_content_name) -1] = '\0';

	strncpy(send_q->sq_content_id, myrow[16], sizeof(send_q->sq_content_id));
	send_q->sq_content_id[sizeof(send_q->sq_content_id) -1] = '\0';
	
    	strncpy(send_q->sq_provider, myrow[17], sizeof(send_q->sq_provider));
	send_q->sq_provider[sizeof(send_q->sq_provider) -1] = '\0';
	
    	strncpy(send_q->sq_province, myrow[18], sizeof(send_q->sq_province));
	send_q->sq_province[sizeof(send_q->sq_province) -1] = '\0';
	
    	strncpy(send_q->sq_sms_scheduletime, myrow[19], sizeof(send_q->sq_sms_scheduletime));
	send_q->sq_sms_scheduletime[sizeof(send_q->sq_sms_scheduletime)-1] = '\0';
	
    	strncpy(send_q->sq_send_time, myrow[20], sizeof(send_q->sq_send_time));
	send_q->sq_send_time[sizeof(send_q->sq_send_time) -1] = '\0';
	
    	strncpy(send_q->sq_submit_id, myrow[21], sizeof(send_q->sq_submit_id));
	send_q->sq_submit_id[sizeof(send_q->sq_submit_id)-1] = '\0';
	
    	strncpy(send_q->sq_submit_stat, myrow[22], sizeof(send_q->sq_submit_stat));
	send_q->sq_submit_stat[sizeof(send_q->sq_submit_stat ) -1] = '\0';
	
    	strncpy(send_q->sq_submit_time, myrow[23], sizeof(send_q->sq_submit_time));
	send_q->sq_submit_time[sizeof(send_q->sq_submit_time) -1] = '\0';
	
    	strncpy(send_q->sq_linkid, myrow[24], sizeof(send_q->sq_linkid));
	send_q->sq_linkid[sizeof(send_q->sq_linkid) -1] = '\0';
	
    	strncpy(send_q->sq_jf_code, myrow[25], sizeof(send_q->sq_jf_code));
	send_q->sq_jf_code[sizeof(send_q->sq_jf_code) -1] = '\0';
	
    	strncpy(send_q->sq_product, myrow[26], sizeof(send_q->sq_product));
	send_q->sq_product[sizeof(send_q->sq_product)-1] = '\0';
	
    	strncpy(send_q->sq_zone_province, myrow[27], sizeof(send_q->sq_zone_province));
	send_q->sq_zone_province[sizeof(send_q->sq_zone_province) -1] = '\0';
	
    	strncpy(send_q->sq_zone_city, myrow[28], sizeof(send_q->sq_zone_city));
	send_q->sq_zone_city[sizeof(send_q->sq_zone_city) -1] = '\0';
	
    	strncpy(send_q->sq_from, myrow[29], sizeof(send_q->sq_from));
	send_q->sq_from[sizeof(send_q->sq_from)-1] = '\0';
	
    	strncpy(send_q->sq_wamid, myrow[30], sizeof(send_q->sq_wamid));
	send_q->sq_wamid[sizeof(send_q->sq_wamid) -1] = '\0';
	
    	strncpy(send_q->sq_reg_cmd, myrow[31], sizeof(send_q->sq_reg_cmd));
	send_q->sq_reg_cmd[sizeof(send_q->sq_reg_cmd) -1] = '\0';
	
    	strncpy(send_q->sq_reg_gateway, myrow[32], sizeof(send_q->sq_reg_gateway));
	send_q->sq_reg_gateway[sizeof(send_q->sq_reg_gateway) -1] = '\0';
	
    	strncpy(send_q->sq_reg_from, myrow[33], sizeof(send_q->sq_reg_from));
	send_q->sq_reg_from[sizeof(send_q->sq_reg_from)-1] = '\0';
	
#if 1
    {
       INFO("[DEBUG]: sq_id:               [%s]\n[DEBUG]: sq_service_code:     [%s]\n\
[DEBUG]: sq_pri:           	   	[%s]\n[DEBUG]: sq_message_format:   [%s]\n\
[DEBUG]: sq_fee_type:         [%s]\n\
[DEBUG]: sq_fee_code:         [%s]\n[DEBUG]: sq_sms_length:       [%s]\n\
[DEBUG]: sq_sms_content:      	   	[%s]\n[DEBUG]: sq_content_type:     [%s]\n\
[DEBUG]: sq_desc_pi:          [%s]\n[DEBUG]: sq_desc_mi:          [%s]\n\
[DEBUG]: sq_mobile:           [%s]\n[DEBUG]: sq_send:             	   	[%s]\n\
[DEBUG]: sq_fee_mobile:       [%s]\n[DEBUG]: sq_msg_type:         [%s]\n\
[DEBUG]: sq_content_name:     [%s]\n[DEBUG]: sq_content_id:       [%s]\n\
[DEBUG]: sq_provider:         	   	[%s]\n[DEBUG]: sq_province:         [%s]\n\
[DEBUG]: sq_sms_scheduletime: [%s]\n[DEBUG]: sq_send_time:        [%s]\n\
[DEBUG]: sq_submit_id:        [%s]\n[DEBUG]: sq_submit_stat:      	   	[%s]\n\
[DEBUG]: sq_submit_time:      [%s]\n[DEBUG]: sq_linkid:           [%s]\n\
[DEBUG]: sq_jf_code:          [%s]\n[DEBUG]: sq_product:          [%s]\n\
[DEBUG]: sq_zone_province:    	   	[%s]\n[DEBUG]: sq_zone_city:        [%s]\n\
[DEBUG]: sq_from:             [%s]\n[DEBUG]: sq_wamid:            [%s]\n\
[DEBUG]: sq_reg_cmd:          [%s]\n[DEBUG]: sq_reg_gateway:      	   	[%s]\n\
[DEBUG]: sq_reg_from:         [%s]\n", myrow[0], myrow[1], myrow[2], myrow[3], 
	   	myrow[4], myrow[5], myrow[6], myrow[7], myrow[8], myrow[9], myrow[10], myrow[11], 
	   	myrow[12], myrow[13], myrow[14], myrow[15], myrow[16], myrow[17], myrow[18], 
	   	myrow[19], myrow[20], myrow[21], myrow[22], myrow[23], myrow[24], myrow[25], 
	   	myrow[26], myrow[27], myrow[28], myrow[29], myrow[30], myrow[31], myrow[32], 
	   	myrow[33]);

    }
    
#endif
}

void _InsertSendLog(MYSQL *fsql, const char *db, SEND_Q *const send, char *const stat) 
{
    char day[9];
    char content[256];
    char tempquery[1024];
	
    getday(day); 
    mysql_escape_string(content, send->sq_sms_content, strlen(send->sq_sms_content));
   
    if (send->sq_msg_type == 10) {
	
        sprintf(tempquery, "insert into %s.send_smc_%s values('%s','%s', now(), '%s','%s','%s', 1, '%s','%s','%s','%s','%s','%s','%s','%s','%s', '%s','%s', '%s')",
                db,
                day,
                send->sq_service_code,
                send->sq_mobile,
                //send->sq_date,
                send->sq_provider,
                send->sq_fee_code,
                send->sq_submit_time,
                //send->sq_num,
                stat,
                send->sq_jf_code,
                "0",          //send->sq_send,
                send->sq_product,
                send->sq_zone_province,
                send->sq_zone_city,
                send->sq_from,
                send->sq_reg_cmd,
                send->sq_reg_gateway,
                send->sq_reg_from,
                content,
                send->sq_reg_gateway);
		mysql_real_query(fsql,tempquery,strlen(tempquery));
    } else if ((send->sq_msg_type > 0) || (send->sq_msg_type < 10)) {
        sprintf(tempquery, "insert into %s.send_log_%s values('%s','%s','%s',NOW(),'%s','%s','%s','%s',%d,'%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')",
                db,
                day,
                send->sq_service_code,
                content,
                send->sq_mobile,
                //send->sq_date,
                send->sq_send,
                send->sq_provider,
                send->sq_province,
                send->sq_fee_mobile,
                send->sq_msg_type,              // %d
                send->sq_content_name,
                send->sq_content_id,
                send->sq_send_time,
                send->sq_sms_scheduletime,
                send->sq_fee_type,
                send->sq_fee_code,
                stat,
                send->sq_linkid,
                send->sq_submit_time,
                send->sq_jf_code,
                send->sq_product,
                send->sq_zone_province,
                send->sq_zone_city,
                send->sq_from,
                send->sq_wamid,
                send->sq_reg_cmd,
                send->sq_reg_gateway,
                send->sq_reg_from);
		mysql_real_query(fsql,tempquery,strlen(tempquery));
    } else {
        INFO("[-ERR: unknown msg_type\n");
    }
}

/* 网关使用 */
void InsertSendLog(MYSQL *fsql, const char *db, SEND_Q *const send, int nFlag) 
{
    char stat[15];

    if (nFlag == 0) { //发送成功
        strcpy(stat, "success");
    } else if (nFlag == -3) {
        strcpy(stat, "unsend");
    } else if (nFlag == -1) {
        strcpy(stat, "fail");
    } else {
        snprintf(stat, sizeof(stat), "%s%d", "fail", nFlag);
    }
    _InsertSendLog(fsql, db, send, stat);
}

/* 状态报告程序使用 */
void InsertSendLog2(MYSQL *fsql, const char *db, SEND_Q *const send, const char *code)
{
    char stat[15];

    if ((strcmp(code, "0") == 0) ||
            (strcmp(code, "000") == 0) ||
            (strcmp(code, "DELIVRD") == 0) ||
            (strcmp(code, "ACCEPTD") == 0)) {
        strcpy(stat, "success");
    } else if ((strcmp(code, "UNDELIV") == 0) || (strcmp(code, "undeliv") == 0)) {
        strcpy(stat, "undeliv");
    } else {
        sprintf(stat, "%s%s", "SMC_", code);
    }
    _InsertSendLog(fsql, db, send, stat);
}

void InsertSendReport(MYSQL *fsql, const char *db, SEND_Q *const send)
{
    char content[256];
    char tempquery[1024];

	
    send->sq_desc_pi[0] = '\0';
    send->sq_desc_mi[0] = '\0';
   
    mysql_escape_string(content, send->sq_sms_content, strlen(send->sq_sms_content)) ;
    sprintf(tempquery, "insert into %s.send_report values (NULL,'%s',%d,'%s','%s','%s',%d,'%s','%s','%s','%s','%s','%s','%s',%d,'%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')",
            db,
            //send->sq_id,
            send->sq_service_code,
            send->sq_pri,               // %d
            send->sq_message_format,
            send->sq_fee_type,
            send->sq_fee_code,
            send->sq_sms_length,        // %d
            content,
            send->sq_content_type,
            send->sq_desc_pi,
            send->sq_desc_mi,
            send->sq_mobile,
            send->sq_send,
            send->sq_fee_mobile,
            send->sq_msg_type,          // %d
            send->sq_content_name,
            send->sq_content_id,
            send->sq_provider,
            send->sq_province,
            send->sq_sms_scheduletime,
            send->sq_send_time,
            send->sq_submit_id,
            "SMC",                      //send->sq_submit_stat,
            send->sq_submit_time,
            send->sq_linkid,
            send->sq_jf_code,
            send->sq_product,
            send->sq_zone_province,
            send->sq_zone_city,
            send->sq_from,
            send->sq_wamid,
            send->sq_reg_cmd,
            send->sq_reg_gateway,
            send->sq_reg_from);
	
    mysql_real_query(fsql,tempquery, strlen(tempquery));
}

⌨️ 快捷键说明

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