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