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

📄 cmpp.c

📁 移动短信网关协议CMPPv2.0的封装实现
💻 C
📖 第 1 页 / 共 3 页
字号:
	memcpy(ptr, &var8, len);
	ptr += len;
	
	len = (unsigned int)var8;
	memcpy(ptr, pBody->Msg_Content, len);
	ptr += len;
	
	len = sizeof(pBody->Reserve) - 1;
	memcpy(ptr, pBody->Reserve, len);
	ptr += len;
	
	// 修改消息头中长度
	len = ptr - ppdu;
	var32 = htonl(len);
	memcpy(ppdu, &var32, 4);
	
	// 发送数据包
	if (send(sockfd, ppdu, (int)len, 0) != (int)len) 
	{
		return -1;
	}
	
	return 0;
}

int cmppDeliverResp(SOCKET sockfd, 
	const unsigned long Sequence_Id, const CMPP_BODY_DELIVER_RESP *pBody)
{
	char ppdu[CMPP_PDU_SIZE], *ptr;
	unsigned int len;
	unsigned char var8;
	unsigned long var32;

	if (sockfd == INVALID_SOCKET)
		return -1;

	memset(ppdu, 0, sizeof(ppdu));
	ptr = ppdu;
	
	// 消息头
	ptr += 4;
	
	var32 = htonl(CMPP_DELIVER_RESP);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(Sequence_Id);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	// 消息体
	var32 = pBody->Msg_Id1;
	var32 = htonl(var32);
	len = 4;
	memcpy(ptr, &var32, len);
	ptr += len;
	
	var32 = pBody->Msg_Id2;
	var32 = htonl(var32);
	len = 4;
	memcpy(ptr, &var32, len);
	ptr += len;
	
	var8 = pBody->Result;
	len = 1;
	memcpy(ptr, &var8, len);
	ptr += len;
	
	// 修改消息头中长度
	len = ptr - ppdu;
	var32 = htonl(len);
	memcpy(ppdu, &var32, 4);
	
	// 发送数据包
	if (send(sockfd, ppdu, (int)len, 0) != (int)len) 
	{
		return -1;
	}
	
	return 0;
}

int cmppQuery(SOCKET sockfd, 
	const unsigned long Sequence_Id, const CMPP_BODY_QUERY *pBody)
{
	char ppdu[CMPP_PDU_SIZE], *ptr;
	unsigned int len;
	unsigned char var8;
	unsigned long var32;

	if (sockfd == INVALID_SOCKET)
		return -1;

	memset(ppdu, 0, sizeof(ppdu));
	ptr = ppdu;
	
	// 消息头
	ptr += 4;
	
	var32 = htonl(CMPP_QUERY);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(Sequence_Id);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	// 消息体
	len = sizeof(pBody->Time) - 1;
	memcpy(ptr, pBody->Time, len);
	ptr += len;
	
	var8 = pBody->Query_Type;
	len = 1;
	memcpy(ptr, &var8, len);
	ptr += len;
	
	len = sizeof(pBody->Query_Code) - 1;
	memcpy(ptr, pBody->Query_Code, len);
	ptr += len;
	
	len = sizeof(pBody->Reserve) - 1;
	memcpy(ptr, pBody->Reserve, len);
	ptr += len;
	
	// 修改消息头中长度
	len = ptr - ppdu;
	var32 = htonl(len);
	memcpy(ppdu, &var32, 4);
	
	// 发送数据包
	if (send(sockfd, ppdu, (int)len, 0) != (int)len) 
	{
		return -1;
	}
	
	return 0;
}

int cmppQueryResp(SOCKET sockfd, 
	const unsigned long Sequence_Id, const CMPP_BODY_QUERY_RESP *pBody)
{
	char ppdu[CMPP_PDU_SIZE], *ptr;
	unsigned int len;
	unsigned char var8;
	unsigned long var32;

	if (sockfd == INVALID_SOCKET)
		return -1;

	memset(ppdu, 0, sizeof(ppdu));
	ptr = ppdu;
	
	// 消息头
	ptr += 4;
	
	var32 = htonl(CMPP_QUERY_RESP);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(Sequence_Id);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	// 消息体
	len = sizeof(pBody->Time) - 1;
	memcpy(ptr, pBody->Time, len);
	ptr += len;
	
	var8 = pBody->Query_Type;
	len = 1;
	memcpy(ptr, &var8, len);
	ptr += len;
	
	len = sizeof(pBody->Query_Code) - 1;
	memcpy(ptr, pBody->Query_Code, len);
	ptr += len;
	
	var32 = pBody->MT_TLMsg;
	var32 = htonl(var32);
	len = 4;
	memcpy(ptr, &var32, len);
	ptr += len;
	
	var32 = pBody->MT_Tlusr;
	var32 = htonl(var32);
	len = 4;
	memcpy(ptr, &var32, len);
	ptr += len;
	
	var32 = pBody->MT_Scs;
	var32 = htonl(var32);
	len = 4;
	memcpy(ptr, &var32, len);
	ptr += len;
	
	var32 = pBody->MT_WT;
	var32 = htonl(var32);
	len = 4;
	memcpy(ptr, &var32, len);
	ptr += len;
	
	var32 = pBody->MT_FL;
	var32 = htonl(var32);
	len = 4;
	memcpy(ptr, &var32, len);
	ptr += len;
	
	var32 = pBody->MO_Scs;
	var32 = htonl(var32);
	len = 4;
	memcpy(ptr, &var32, len);
	ptr += len;
	
	var32 = pBody->MO_WT;
	var32 = htonl(var32);
	len = 4;
	memcpy(ptr, &var32, len);
	ptr += len;
	
	var32 = pBody->MO_FL;
	var32 = htonl(var32);
	len = 4;
	memcpy(ptr, &var32, len);
	ptr += len;
		
	// 修改消息头中长度
	len = ptr - ppdu;
	var32 = htonl(len);
	memcpy(ppdu, &var32, 4);
	
	// 发送数据包
	if (send(sockfd, ppdu, (int)len, 0) != (int)len) 
	{
		return -1;
	}
	
	return 0;
}

int cmppCancel(SOCKET sockfd, 
	const unsigned long Sequence_Id, const CMPP_BODY_CANCEL *pBody)
{
	char ppdu[CMPP_PDU_SIZE], *ptr;
	unsigned int len;
	unsigned long var32;

	if (sockfd == INVALID_SOCKET)
		return -1;

	memset(ppdu, 0, sizeof(ppdu));
	ptr = ppdu;
	
	// 消息头
	ptr += 4;
	
	var32 = htonl(CMPP_CANCEL);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(Sequence_Id);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	// 消息体
	var32 = pBody->Msg_Id1;
	var32 = htonl(var32);
	len = 4;
	memcpy(ptr, &var32, len);
	ptr += len;
	
	var32 = pBody->Msg_Id2;
	var32 = htonl(var32);
	len = 4;
	memcpy(ptr, &var32, len);
	ptr += len;
	
	// 修改消息头中长度
	len = ptr - ppdu;
	var32 = htonl(len);
	memcpy(ppdu, &var32, 4);
	
	// 发送数据包
	if (send(sockfd, ppdu, (int)len, 0) != (int)len) 
	{
		return -1;
	}
	
	return 0;
}

int cmppCancelResp(SOCKET sockfd, 
	const unsigned long Sequence_Id, const CMPP_BODY_CANCEL_RESP *pBody)
{
	char ppdu[CMPP_PDU_SIZE], *ptr;
	unsigned int len;
	unsigned char var8;
	unsigned long var32;

	if (sockfd == INVALID_SOCKET)
		return -1;

	memset(ppdu, 0, sizeof(ppdu));
	ptr = ppdu;
	
	// 消息头
	ptr += 4;
	
	var32 = htonl(CMPP_CANCEL_RESP);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(Sequence_Id);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	// 消息体
	var8 = pBody->Success_Id;
	len = 1;
	memcpy(ptr, &var8, len);
	ptr += len;

	// 修改消息头中长度
	len = ptr - ppdu;
	var32 = htonl(len);
	memcpy(ppdu, &var32, 4);
	
	// 发送数据包
	if (send(sockfd, ppdu, (int)len, 0) != (int)len) 
	{
		return -1;
	}
	
	return 0;
}

int cmppActiveTest(SOCKET sockfd, 
	const unsigned long Sequence_Id)
{
	char ppdu[CMPP_PDU_SIZE], *ptr;
	unsigned int len;
	unsigned long var32;

	if (sockfd == INVALID_SOCKET)
		return -1;

	memset(ppdu, 0, sizeof(ppdu));
	ptr = ppdu;
	
	// 消息头
	ptr += 4;
	
	var32 = htonl(CMPP_ACTIVE_TEST);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(Sequence_Id);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	// 修改消息头中长度
	len = ptr - ppdu;
	var32 = htonl(len);
	memcpy(ppdu, &var32, 4);
	
	// 发送数据包
	if (send(sockfd, ppdu, (int)len, 0) != (int)len) 
	{
		return -1;
	}
	
	return 0;
}

int cmppActiveTestResp(SOCKET sockfd, 
	const unsigned long Sequence_Id, const CMPP_BODY_ACTIVE_TEST_RESP *pBody)
{
	char ppdu[CMPP_PDU_SIZE], *ptr;
	unsigned int len;
	unsigned char var8;
	unsigned long var32;

	if (sockfd == INVALID_SOCKET)
		return -1;

	memset(ppdu, 0, sizeof(ppdu));
	ptr = ppdu;
	
	// 消息头
	ptr += 4;
	
	var32 = htonl(CMPP_ACTIVE_TEST_RESP);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(Sequence_Id);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	// 消息体
	var8 = pBody->Reserve;
	len = 1;
	memcpy(ptr, &var8, len);
	ptr += len;
	
	// 修改消息头中长度
	len = ptr - ppdu;
	var32 = htonl(len);
	memcpy(ppdu, &var32, 4);
	
	// 发送数据包
	if (send(sockfd, ppdu, (int)len, 0) != (int)len) 
	{
		return -1;
	}
	
	return 0;
}

static int cmppDecodeConnect(const char *rawBody, unsigned int len, CMPP_BODY_CONNECT *msgBody)
{
	unsigned int sum = 0;
	unsigned char var8;
	unsigned long var32;
	const char *ptr = rawBody;

	if (rawBody == NULL || msgBody == NULL)
		return -1;
		
	memset(msgBody, 0, sizeof(*msgBody));

	if ((unsigned int)(ptr - rawBody) >= len)
		return -1;
	
	sum = sizeof(msgBody->Source_Addr) - 1;
	memcpy(msgBody->Source_Addr, ptr, sum);
	ptr = ptr + sum;
	if ((unsigned int)(ptr - rawBody) >= len)
		return -1;
	
	sum = sizeof(msgBody->AuthenticatorSource) - 1;
	memcpy(msgBody->AuthenticatorSource, ptr, sum);
	ptr = ptr + sum;
	if ((unsigned int)(ptr - rawBody) >= len)
		return -1;
	
	memcpy(&var8, ptr, 1);
	msgBody->Version = var8;
	ptr = ptr + 1;
	if ((unsigned int)(ptr - rawBody) >= len)
		return -1;
	
	memcpy(&var32, ptr, 4);
	var32 = ntohl(var32);
	msgBody->Timestamp = var32;
	ptr = ptr + 4;
	if ((unsigned int)(ptr - rawBody) > len)
		return -1;
	
	return 0;
}

static int cmppDecodeConnectResp(const char *rawBody, unsigned int len, CMPP_BODY_CONNECT_RESP *msgBody)
{
	unsigned int sum = 0;
	unsigned char var8;
	const char *ptr = rawBody;

	if (rawBody == NULL || msgBody == NULL)
		return -1;
		
	memset(msgBody, 0, sizeof(*msgBody));

	if ((unsigned int)(ptr - rawBody) >= len)
		return -1;
	
	memcpy(&var8, ptr, 1);
	msgBody->Status = var8;
	ptr = ptr + 1;
	if ((unsigned int)(ptr - rawBody) >= len)
		return -1;
	
	sum = sizeof(msgBody->AuthenticatorISMG) - 1;
	memcpy(msgBody->AuthenticatorISMG, ptr, sum);
	ptr = ptr + sum;
	if ((unsigned int)(ptr - rawBody) >= len)
		return -1;
	
	memcpy(&var8, ptr, 1);
	msgBody->Version = var8;
	ptr = ptr + 1;
	if ((unsigned int)(ptr - rawBody) > len)
		return -1;
	
	return 0;
}

static int cmppDecodeSubmit(const char *rawBody, unsigned int len, CMPP_BODY_SUBMIT *msgBody)
{
	unsigned int sum = 0;
	unsigned char i, var8;
	unsigned long var32;
	const char *ptr = rawBody;

	if (rawBody == NULL || msgBody == NULL)
		return -1;
		
	memset(msgBody, 0, sizeof(*msgBody));

	if ((unsigned int)(ptr - rawBody) >= len)
		return -1;
	
	memcpy(&var32, ptr, 4);
	var32 = ntohl(var32);
	msgBody->Msg_Id1 = var32;
	ptr = ptr + 4;
	if ((unsigned int)(ptr - rawBody) >= len)
		return -1;
	
	memcpy(&var32, ptr, 4);
	var32 = ntohl(var32);
	msgBody->Msg_Id2 = var32;
	ptr = ptr + 4;
	if ((unsigned int)(ptr - rawBody) >= len)
		return -1;
	
	memcpy(&var8, ptr, 1);
	msgBody->Pk_total = var8;
	ptr = ptr + 1;
	if ((unsigned int)(ptr - rawBody) >= len)
		return -1;
	
	memcpy(&var8, ptr, 1);
	msgBody->Pk_number = var8;
	ptr = ptr + 1;
	if ((unsigned int)(ptr - rawBody) >= len)
		return -1;
	
	memcpy(&var8, ptr, 1);
	msgBody->Registered_Delivery = var8;
	ptr = ptr + 1;
	if ((unsigned int)(ptr - rawBody) >= len)
		return -1;

	memcpy(&var8, ptr, 1);
	msgBody->Msg_level = var8;
	ptr = ptr + 1;
	if ((unsigned int)(ptr - rawBody) >= len)
		return -1;

	sum = sizeof(msgBody->Service_Id) - 1;
	memcpy(msgBody->Service_Id, ptr, sum);
	ptr = ptr + sum;
	if ((unsigned int)(ptr - rawBody) >= len)
		return -1;

	memcpy(&var8, ptr, 1);
	msgBody->Fee_UserType = var8;
	ptr = ptr + 1;
	if ((unsigned int)(ptr - rawBody) >= len)
		return -1;

	sum = sizeof(msgBody->Fee_terminal_Id) - 1;
	memcpy(msgBody->Fee_terminal_Id, ptr, sum);

⌨️ 快捷键说明

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