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

📄 tcpservice.c

📁 TCP的代码
💻 C
字号:
#include <string.h>
#include "protocal.h"
#include "TCPService.h"
#include "socket.h"
#include "w3150a.h"

BYTE *RecvTCPBuf;
extern DEVICE_CONFIG	 	volatile  	*g_DEVICE_CONFIG;
BOOL g_send_realtime_passenger = 0;
BOOL g_stop_realtime_passenger = 0;

extern PASSENGER_RECORD    g_passenger_record;

int TCPSendData(SOCKET s, BYTE* buf, WORD len)
{
	send(s,buf,len);
	return 1;
}

void TCP_Req_Msg_Process(SOCKET socket,BYTE bBufData[],WORD wLen)
{
	NETSETTING net;
	PROTOCOLTIME datetime;
	WORD dwSizeoftype = 0; //i = 0;
	WORD *lenth = NULL,*num = NULL;
	DWORD packet_num;
	BYTE *pTemp;

	WORD len;
	DWORD			packet_info;
	WORD			packet_lenth=0;
	
	bBufData[0] = 'r';
	switch (bBufData[1])
	{	
		case MC_READ:
			//读取数据
			switch (bBufData[3])
			{
				case FC_DATA_TIME:
					dwSizeoftype = sizeof(PROTOCOLTIME); 
					lenth = (WORD *)(bBufData + 4);
					*lenth = dwSizeoftype;
					GetDatetimeSetting(&datetime);
					memcpy(bBufData+8,&datetime,dwSizeoftype);
					break;
				case FC_GET_PASSENGERS:
					g_send_realtime_passenger = 1;
					g_stop_realtime_passenger = 0;

					break;
				case FC_STOP_PASSENGERS:
					g_send_realtime_passenger = 0;
					g_stop_realtime_passenger = 1;
					break;
				case FC_GET_HIST_PASSENGERS:
					{

					}
					break;
				default:
					//不支持的模块
					bBufData[3] = FC_ERROR;
					TCPSendData(socket, bBufData, wLen);
					return;
			}
		TCPSendData(socket, bBufData, (WORD)8+dwSizeoftype);
		break;
		default:
			//不支持的模块
			bBufData[3] = FC_ERROR;
			TCPSendData(socket, bBufData, wLen);
			return;	
		}
}

//发送实时客流数据
void TCPSendNumData(void)
{
	BYTE * bBufData = RecvTCPBuf;
	DWORD lenth;

	//	*((DWORD *)(buf+24)) = ConfigID;	

	bBufData[0] = 'a';
	bBufData[1] = MC_WRITE;
	bBufData[2] = FC_PASSENGERS_STREAM;

	lenth = sizeof(PASSENGER_RECORD);
	*(DWORD *)(bBufData+4) = lenth;

	memcpy(bBufData+8, &g_passenger_record, lenth);

	TCPSendData(1, bBufData,lenth+8);
}


void Init_TcpClient_Socket1(SOCKET s, WORD protocol, WORD local_port)// initialize tcp socket 1 for  client
{
	BYTE flag = 0;
	NETSETTING net;
	
	GetNetSetting(&net);

	socket(s, protocol, local_port, flag);	/* Create a new socket */
	connect(s, net.dest_addr, (WORD)net.dest_port);
}

static BYTE g_TCP_packet_num = 0;

void Socket1_Process(void)
{
	BYTE flag = 0;
	WORD RecvSize;
	SOCKET s = 1;
	WORD local_port = 5000;				// Variable to be used to store Destination Port in RecvFrom()

	switch((BYTE)select(s, SEL_CONTROL))
	{
		case SOCK_ESTABLISHED:// If client is connected
			////第一次连接上,设置TCP发送结果数据标志
			//if(g_TCP_connect_flag == false)
			//{
			//	//set_led(LED_MD_TCP_STATE);
			//	g_TCP_connect_flag = true;
			//	g_TCP_stream_flag = true;
			//}

			if((RecvSize = select(s, SEL_RECV)) > 0)// Confirm if received the data
			{
				if(RecvSize > TCP_BUFFER_SIZE)
				{
					Init_TcpClient_Socket1(s,SOCK_STREAM,local_port);
				}
				memset(RecvTCPBuf, 0, TCP_BUFFER_SIZE);
				RecvSize = recv(s, RecvTCPBuf, RecvSize);// Loopback received data from client

				if(RecvSize > 0)
				{
					if (RecvTCPBuf[0] == 'a')
					{
						TCP_Req_Msg_Process(s, RecvTCPBuf, RecvSize);
					}

				}

			}
	
			if (g_send_realtime_passenger == 1)
			{
				TCPSendNumData();
			}


			break;
		case SOCK_CLOSE_WAIT:// If the client request to close connection and wait for closing successfully
			close(s);
			break;
		case SOCK_CLOSED:// If the socket connected to client already has been closed
				Init_TcpClient_Socket1(s,SOCK_STREAM,local_port);// To do loopback service again in closed channel, wait in initialization and server mode
			break;
		default:
			break;
	}


}

⌨️ 快捷键说明

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