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

📄 sgip.c

📁 SGIP协议封装
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "sgip.h"

int sgipBind(SOCKET sockfd, 
	const unsigned long *SequenceNumber, const SGIP_BODY_BIND *pBody)
{
	char ppdu[SGIP_PDU_SIZE], *ptr;
	unsigned int len;
	unsigned char var8;
	unsigned long var32;

	if (sockfd == INVALID_SOCKET)
		return -1;

	if (SequenceNumber == NULL || pBody == NULL)
		return -1;

	memset(ppdu, 0, sizeof(ppdu));
	ptr = ppdu;
	
	// 消息头
	ptr += 4;
	
	var32 = htonl(SGIP_BIND);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(SequenceNumber[0]);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(SequenceNumber[1]);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(SequenceNumber[2]);
	memcpy(ptr, &var32, 4);
	ptr += 4;

	// 消息体
	var8 = pBody->LoginType;
	len = 1;
	memcpy(ptr, &var8, len);
	ptr += len;
	
	len = sizeof(pBody->LoginName) - 1;
	memcpy(ptr, pBody->LoginName, len);
	ptr += len;
	
	len = sizeof(pBody->LoginPassword) - 1;
	memcpy(ptr, pBody->LoginPassword, 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) 
	{
		closesocket(sockfd);
		return -1;
	}
		
	return 0;
}

int sgipBindResp(SOCKET sockfd, 
	const unsigned long *SequenceNumber, const SGIP_BODY_BIND_RESP *pBody)
{
	char ppdu[SGIP_PDU_SIZE], *ptr;
	unsigned int len;
	unsigned char var8;
	unsigned long var32;
	
	if (sockfd == INVALID_SOCKET)
		return -1;

	if (SequenceNumber == NULL || pBody == NULL)
		return -1;

	memset(ppdu, 0, sizeof(ppdu));
	ptr = ppdu;

	// 消息头
	ptr += 4;
	
	var32 = htonl(SGIP_BIND_RESP);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(SequenceNumber[0]);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(SequenceNumber[1]);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(SequenceNumber[2]);
	memcpy(ptr, &var32, 4);
	ptr += 4;

	// 消息体
	var8 = pBody->Result;
	len = 1;
	memcpy(ptr, &var8, 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) 
	{
		closesocket(sockfd);
		return -1;
	}
	
	return 0;
}

int sgipUnbind(SOCKET sockfd, 
	const unsigned long *SequenceNumber)
{
	char ppdu[SGIP_PDU_SIZE], *ptr;
	unsigned int len;
	unsigned long var32;
	
	if (sockfd == INVALID_SOCKET)
		return -1;

	if (SequenceNumber == NULL)
		return -1;

	memset(ppdu, 0, sizeof(ppdu));
	ptr = ppdu;

	// 消息头
	ptr += 4;
	
	var32 = htonl(SGIP_UNBIND);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(SequenceNumber[0]);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(SequenceNumber[1]);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(SequenceNumber[2]);
	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) 
	{
		closesocket(sockfd);
		return -1;
	}
	
	return 0;
}

int sgipUnbindResp(SOCKET sockfd, 
	const unsigned long *SequenceNumber)
{
	char ppdu[SGIP_PDU_SIZE], *ptr;
	unsigned int len;
	unsigned long var32;
	
	if (sockfd == INVALID_SOCKET)
		return -1;

	if (SequenceNumber == NULL)
		return -1;

	memset(ppdu, 0, sizeof(ppdu));
	ptr = ppdu;	
	
	// 消息头
	ptr += 4;
	
	var32 = htonl(SGIP_UNBIND_RESP);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(SequenceNumber[0]);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(SequenceNumber[1]);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(SequenceNumber[2]);
	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) 
	{
		closesocket(sockfd);
		return -1;
	}
	
	return 0;
}

int sgipSubmit(SOCKET sockfd, 
	const unsigned long *SequenceNumber, const SGIP_BODY_SUBMIT *pBody)
{
	char ppdu[SGIP_PDU_SIZE], *ptr;
	unsigned int len;
	unsigned char i, var8;
	unsigned long var32;
	
	if (sockfd == INVALID_SOCKET)
		return -1;

	if (SequenceNumber == NULL || pBody == NULL)
		return -1;

	memset(ppdu, 0, sizeof(ppdu));
	ptr = ppdu;
	
	// 消息头
	ptr += 4;
	
	var32 = htonl(SGIP_SUBMIT);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(SequenceNumber[0]);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(SequenceNumber[1]);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(SequenceNumber[2]);
	memcpy(ptr, &var32, 4);
	ptr += 4;

	// 消息体
	len = sizeof(pBody->SPNumber) - 1;
	memcpy(ptr, pBody->SPNumber, len);
	ptr += len;
	
	len = sizeof(pBody->ChargeNumber) - 1;
	memcpy(ptr, pBody->ChargeNumber, len);
	ptr += len;
	
	var8 = pBody->UserCount;
	if (var8 < 1 || var8 > 100) 
		return -1;
	len = 1;
	memcpy(ptr, &var8, len);
	ptr += len;
	
	for (i = 0; i < var8; i++)
	{
		len = sizeof(pBody->UserNumber[i]) - 1;
		memcpy(ptr, pBody->UserNumber[i], len);
		ptr += len;
	}
	
	len = sizeof(pBody->CorpId) - 1;
	memcpy(ptr, pBody->CorpId, len);
	ptr += len;
	
	len = sizeof(pBody->ServiceType) - 1;
	memcpy(ptr, pBody->ServiceType, len);
	ptr += len;
	
	var8 = pBody->FeeType;
	len = 1;
	memcpy(ptr, &var8, len);
	ptr += len;
	
	len = sizeof(pBody->FeeValue) - 1;
	memcpy(ptr, pBody->FeeValue, len);
	ptr += len;
	
	len = sizeof(pBody->GivenValue) - 1;
	memcpy(ptr, pBody->GivenValue, len);
	ptr += len;
	
	var8 = pBody->AgentFlag;
	len = 1;
	memcpy(ptr, &var8, len);
	ptr += len;
	
	var8 = pBody->MOrelatetoMTFlag;
	len = 1;
	memcpy(ptr, &var8, len);
	ptr += len;
	
	var8 = pBody->Priority;
	len = 1;
	memcpy(ptr, &var8, len);
	ptr += len;
	
	len = sizeof(pBody->ExpireTime) - 1;
	memcpy(ptr, pBody->ExpireTime, len);
	ptr += len;
	
	len = sizeof(pBody->ScheduleTime) - 1;
	memcpy(ptr, pBody->ScheduleTime, len);
	ptr += len;
	
	var8 = pBody->ReportFlag;
	len = 1;
	memcpy(ptr, &var8, 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->MessageCoding;
	len = 1;
	memcpy(ptr, &var8, len);
	ptr += len;
	
	var8 = pBody->MessageType;
	len = 1;
	memcpy(ptr, &var8, len);
	ptr += len;
	
	var32 = pBody->MessageLength;
	if (var32 > (sizeof(pBody->MessageContent) - 1))
		var32 = sizeof(pBody->MessageContent) - 1;
	var32 = htonl(var32);
	len = 4;
	memcpy(ptr, &var32, len);
	ptr += len;
	
	var32 = ntohl(var32);
	len = var32;
	memcpy(ptr, pBody->MessageContent, 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) 
	{
		closesocket(sockfd);
		return -1;
	}
	
	return 0;
}

int sgipSubmitResp(SOCKET sockfd, 
	const unsigned long *SequenceNumber, const SGIP_BODY_SUBMIT_RESP *pBody)
{
	char ppdu[SGIP_PDU_SIZE], *ptr;
	unsigned int len;
	unsigned char var8;
	unsigned long var32;
	
	if (sockfd == INVALID_SOCKET)
		return -1;

	if (SequenceNumber == NULL || pBody == NULL)
		return -1;

	memset(ppdu, 0, sizeof(ppdu));
	ptr = ppdu;

	// 消息头
	ptr += 4;
	
	var32 = htonl(SGIP_SUBMIT_RESP);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(SequenceNumber[0]);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(SequenceNumber[1]);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(SequenceNumber[2]);
	memcpy(ptr, &var32, 4);
	ptr += 4;

	// 消息体
	var8 = pBody->Result;
	len = 1;
	memcpy(ptr, &var8, 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) 
	{
		closesocket(sockfd);
		return -1;
	}
	
	return 0;
}

int sgipDeliver(SOCKET sockfd, 
	const unsigned long *SequenceNumber, const SGIP_BODY_DELIVER *pBody)
{
	char ppdu[SGIP_PDU_SIZE], *ptr;
	unsigned int len;
	unsigned char var8;
	unsigned long var32;
	
	if (sockfd == INVALID_SOCKET)
		return -1;

	if (SequenceNumber == NULL || pBody == NULL)
		return -1;

	memset(ppdu, 0, sizeof(ppdu));
	ptr = ppdu;
	
	// 消息头
	ptr += 4;
	
	var32 = htonl(SGIP_DELIVER);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(SequenceNumber[0]);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(SequenceNumber[1]);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(SequenceNumber[2]);
	memcpy(ptr, &var32, 4);
	ptr += 4;

	// 消息体
	len = sizeof(pBody->UserNumber) - 1;
	memcpy(ptr, pBody->UserNumber, len);
	ptr += len;

	len = sizeof(pBody->SPNumber) - 1;
	memcpy(ptr, pBody->SPNumber, 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->MessageCoding;
	len = 1;
	memcpy(ptr, &var8, len);
	ptr += len;
	
	var32 = pBody->MessageLength;
	if (var32 > (sizeof(pBody->MessageContent) - 1))
		var32 = sizeof(pBody->MessageContent) - 1;
	var32 = htonl(var32);
	len = 4;
	memcpy(ptr, &var32, len);
	ptr += len;
	
	var32 = ntohl(var32);
	len = var32;
	memcpy(ptr, pBody->MessageContent, 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) 
	{
		closesocket(sockfd);
		return -1;
	}
	
	return 0;
}

int sgipDeliverResp(SOCKET sockfd, 
	const unsigned long *SequenceNumber, const SGIP_BODY_DELIVER_RESP *pBody)
{
	char ppdu[SGIP_PDU_SIZE], *ptr;
	unsigned int len;
	unsigned char var8;
	unsigned long var32;
	
	if (sockfd == INVALID_SOCKET)
		return -1;

	if (SequenceNumber == NULL || pBody == NULL)
		return -1;

	memset(ppdu, 0, sizeof(ppdu));
	ptr = ppdu;

	// 消息头
	ptr += 4;
	
	var32 = htonl(SGIP_DELIVER_RESP);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(SequenceNumber[0]);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(SequenceNumber[1]);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(SequenceNumber[2]);
	memcpy(ptr, &var32, 4);
	ptr += 4;

	// 消息体
	var8 = pBody->Result;
	len = 1;
	memcpy(ptr, &var8, 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) 
	{
		closesocket(sockfd);
		return -1;
	}
	
	return 0;
}

int sgipReport(SOCKET sockfd, 
	const unsigned long *SequenceNumber, const SGIP_BODY_REPORT *pBody)
{
	char ppdu[SGIP_PDU_SIZE], *ptr;
	unsigned int len;
	unsigned char var8;
	unsigned long var32;
	
	if (sockfd == INVALID_SOCKET)
		return -1;

	if (SequenceNumber == NULL || pBody == NULL)
		return -1;

	memset(ppdu, 0, sizeof(ppdu));
	ptr = ppdu;
	
	// 消息头
	ptr += 4;
	
	var32 = htonl(SGIP_REPORT);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(SequenceNumber[0]);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(SequenceNumber[1]);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var32 = htonl(SequenceNumber[2]);
	memcpy(ptr, &var32, 4);
	ptr += 4;

	// 消息体
	var32 = htonl(pBody->SubmitSequenceNumber[0]);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	var32 = htonl(pBody->SubmitSequenceNumber[1]);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	var32 = htonl(pBody->SubmitSequenceNumber[2]);
	memcpy(ptr, &var32, 4);
	ptr += 4;
	
	var8 = pBody->ReportType;
	len = 1;
	memcpy(ptr, &var8, len);
	ptr += len;
	
	len = sizeof(pBody->UserNumber) - 1;
	memcpy(ptr, pBody->UserNumber, len);
	ptr += len;
	
	var8 = pBody->State;
	len = 1;
	memcpy(ptr, &var8, len);
	ptr += len;
	
	var8 = pBody->ErrorCode;
	len = 1;
	memcpy(ptr, &var8, 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) 
	{
		closesocket(sockfd);
		return -1;
	}
	
	return 0;
}

int sgipReportResp(SOCKET sockfd, 
	const unsigned long *SequenceNumber, const SGIP_BODY_REPORT_RESP *pBody)
{

⌨️ 快捷键说明

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