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

📄 cmpp.c

📁 移动短信网关协议CMPPv2.0的封装实现
💻 C
📖 第 1 页 / 共 3 页
字号:
#include "cmpp.h"

#ifndef __SOCK__
#define __SOCK__
SOCKET sockConnect(const char *host, unsigned short port)
{
	SOCKET sockfd = INVALID_SOCKET;
	struct sockaddr_in serv_addr;
	struct in_addr  addr;
	struct hostent  *hp = NULL;
	struct protoent *protos = NULL;
	int i;
	
	protos = getprotobyname( "tcp" );

    if ((hp = gethostbyname(host)) == NULL) 
	{
        return INVALID_SOCKET;
    }
    
	if ( (sockfd = socket(PF_INET, SOCK_STREAM, 
		(protos != NULL) ? protos->p_proto : 0)) == SOCKET_ERROR ) 
	{
    	return INVALID_SOCKET;
  	}

	for(i=0; hp->h_addr_list[i] != NULL;i++)
	{
		memcpy(&addr, hp->h_addr_list[i] , hp->h_length);
		memset(&serv_addr,0, sizeof(serv_addr));
  		serv_addr.sin_family      = AF_INET;
  		serv_addr.sin_addr		  = addr;
  		serv_addr.sin_port        = htons(port);
		if (connect(sockfd, 
			(struct sockaddr *)&serv_addr, 
			sizeof(serv_addr)) != SOCKET_ERROR) 
		{
			i = -1;
			break;
		} 
	}
	if (i != -1)
	{
		closesocket(sockfd);
    	return INVALID_SOCKET;
	}

	return sockfd;
}

SOCKET sockListen(unsigned short port)
{
	SOCKET sockfd;
	struct sockaddr_in serv_addr;
	struct protoent *protos = NULL;
	int ReuseFlag;
    
	protos = getprotobyname( "tcp" );

	if ((sockfd = socket(PF_INET, SOCK_STREAM, 
		(protos != NULL) ? protos->p_proto : 0 )) == INVALID_SOCKET) 
	{
    	return INVALID_SOCKET;
  	}
	
	memset(&serv_addr, 0, sizeof(serv_addr));
  	serv_addr.sin_family      = AF_INET;
  	serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);  
	serv_addr.sin_port        = htons(port);
  	
  	if (bind(sockfd, 
		(struct sockaddr *)&serv_addr, 
		sizeof(serv_addr)) == SOCKET_ERROR) 
	{
		closesocket(sockfd);
    	return INVALID_SOCKET;
  	}
	
    if (listen(sockfd, SOMAXCONN) == SOCKET_ERROR) 
	{
		closesocket(sockfd);
        return INVALID_SOCKET;
    }

	ReuseFlag = 1;
	setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&ReuseFlag, sizeof(int));

    return sockfd;
}
#endif /* __SOCK__ */

int cmppConnect(SOCKET sockfd, 
	const unsigned long Sequence_Id, const CMPP_BODY_CONNECT *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_CONNECT);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(Sequence_Id);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	// 消息体
	len = sizeof(pBody->Source_Addr) - 1;
	memcpy(ptr, pBody->Source_Addr, len);
	ptr += len;
	
	len = sizeof(pBody->AuthenticatorSource) - 1;
	memcpy(ptr, pBody->AuthenticatorSource, len);
	ptr += len;
	
	var8 = pBody->Version;
	len = 1;
	memcpy(ptr, &var8, len);
	ptr += len;
	
	var32 = pBody->Timestamp;
	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 cmppConnectResp(SOCKET sockfd, 
	const unsigned long Sequence_Id, const CMPP_BODY_CONNECT_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_CONNECT_RESP);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(Sequence_Id);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	// 消息体
	var8 = pBody->Status;
	len = 1;
	memcpy(ptr, &var8, len);
	ptr += len;
	
	len = sizeof(pBody->AuthenticatorISMG) - 1;
	memcpy(ptr, pBody->AuthenticatorISMG, len);
	ptr += len;
	
	var8 = pBody->Version;
	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 cmppTerminate(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_TERMINATE);
	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 cmppTerminateResp(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_TERMINATE_RESP);
	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 cmppSubmit(SOCKET sockfd, 
	const unsigned long Sequence_Id, const CMPP_BODY_SUBMIT *pBody)
{
	char ppdu[CMPP_PDU_SIZE], *ptr;
	unsigned int len;
	unsigned char i, var8;
	unsigned long var32;

	if (sockfd == INVALID_SOCKET)
		return -1;

	memset(ppdu, 0, sizeof(ppdu));
	ptr = ppdu;
	
	// 消息头
	ptr += 4;
	
	var32 = htonl(CMPP_SUBMIT);
	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->Pk_total;
	len = 1;
	memcpy(ptr, &var8, len);
	ptr += len;
	
	var8 = pBody->Pk_number;
	len = 1;
	memcpy(ptr, &var8, len);
	ptr += len;
	
	var8 = pBody->Registered_Delivery;
	len = 1;
	memcpy(ptr, &var8, len);
	ptr += len;
	
	var8 = pBody->Msg_level;
	len = 1;
	memcpy(ptr, &var8, len);
	ptr += len;
	
	len = sizeof(pBody->Service_Id) - 1;
	memcpy(ptr, pBody->Service_Id, len);
	ptr += len;
	
	var8 = pBody->Fee_UserType;
	len = 1;
	memcpy(ptr, &var8, len);
	ptr += len;
	
	len = sizeof(pBody->Fee_terminal_Id) - 1;
	memcpy(ptr, pBody->Fee_terminal_Id, len);
	ptr += len;
	
	var8 = pBody->TP_pid;
	len = 1;
	memcpy(ptr, &var8, len);
	ptr += len;
	
	var8 = pBody->TP_udhi;
	len = 1;
	memcpy(ptr, &var8, len);
	ptr += len;
	
	var8 = pBody->Msg_Fmt;
	len = 1;
	memcpy(ptr, &var8, len);
	ptr += len;
	
	len = sizeof(pBody->Msg_src) - 1;
	memcpy(ptr, pBody->Msg_src, len);
	ptr += len;
	
	len = sizeof(pBody->FeeType) - 1;
	memcpy(ptr, pBody->FeeType, len);
	ptr += len;
	
	len = sizeof(pBody->FeeCode) - 1;
	memcpy(ptr, pBody->FeeCode, len);
	ptr += len;
	
	len = sizeof(pBody->Valid_Time) - 1;
	memcpy(ptr, pBody->Valid_Time, len);
	ptr += len;
	
	len = sizeof(pBody->At_Time) - 1;
	memcpy(ptr, pBody->At_Time, len);
	ptr += len;
	
	len = sizeof(pBody->Src_Id) - 1;
	memcpy(ptr, pBody->Src_Id, len);
	ptr += len;
	
	var8 = pBody->DestUsr_tl;
	if (var8 < 1 || var8 > 100) 
		return -1;
	len = 1;
	memcpy(ptr, &var8, len);
	ptr += len;
	
	for (i = 0; i < var8; i++)
	{
		len = sizeof(pBody->Dest_terminal_Id[i]) - 1;
		memcpy(ptr, pBody->Dest_terminal_Id[i], len);
		ptr += len;
	}
	
	var8 = pBody->Msg_Length;
	if (var8 > (unsigned char)(sizeof(pBody->Msg_Content) - 1))
		var8 = (unsigned char)(sizeof(pBody->Msg_Content) - 1);
	len = 1;
	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 cmppSubmitResp(SOCKET sockfd, 
	const unsigned long Sequence_Id, const CMPP_BODY_SUBMIT_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_SUBMIT_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 cmppDeliver(SOCKET sockfd, 
	const unsigned long Sequence_Id, const CMPP_BODY_DELIVER *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);
	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 = sizeof(pBody->Dest_Id) - 1;
	memcpy(ptr, pBody->Dest_Id, len);
	ptr += len;
	
	len = sizeof(pBody->Service_Id) - 1;
	memcpy(ptr, pBody->Service_Id, len);
	ptr += len;
	
	var8 = pBody->TP_pid;
	len = 1;
	memcpy(ptr, &var8, len);
	ptr += len;
	
	var8 = pBody->TP_udhi;
	len = 1;
	memcpy(ptr, &var8, len);
	ptr += len;
	
	var8 = pBody->Msg_Fmt;
	len = 1;
	memcpy(ptr, &var8, len);
	ptr += len;
	
	len = sizeof(pBody->Src_terminal_Id) - 1;
	memcpy(ptr, pBody->Src_terminal_Id, len);
	ptr += len;
	
	var8 = pBody->Registered_Delivery;
	len = 1;
	memcpy(ptr, &var8, len);
	ptr += len;
	
	var8 = pBody->Msg_Length;
	if (var8 > (unsigned char)(sizeof(pBody->Msg_Content) - 1))
		var8 = (unsigned char)(sizeof(pBody->Msg_Content) - 1);
	len = 1;

⌨️ 快捷键说明

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