📄 tcpservice.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 + -