📄 tcpip.lxc.c
字号:
#include <psos.h>
#include <pna.h>
#include <prepc.h>
#include "sys_conf.h"
#include "constant.h"
#include "structure.h"
#include "command.h"
#define ON 1
#define OFF 0
#define KEEP_ALIVE_CNT 2
#define KEEP_ALIVE_IDLE 5
#define KEEP_ALIVE_INTVL 5
/*******************************************************************/
/* 静态变量声明 */
/*******************************************************************/
static unsigned long TidTcpInit, TidTcpRecv,TidTcpSend;
/*******************************************************************/
/* 全局变量声明 */
/*******************************************************************/
unsigned long ulQidTcpSend;
extern unsigned char Connected;
extern unsigned char Has_Report_Device_Type;
/*******************************************************************/
/* 外部函数声明 */
/*******************************************************************/
/*******************************************************************/
/* 静态函数声明 */
/*******************************************************************/
extern void my_Delay(unsigned long int dly_ms);
static void TkTcpRecvEntry(void);
static void TkTcpSendEntry(void);
static void TkTcpInitEntry(void);
int SockID, SocketID, SndSockID, RevSockID;
/*******************************************************************/
/* 公共函数声明 */
/*******************************************************************/
void InstallTcpTask(void);
/*******************************************************************/
/* 函数名: InstallTcpTask */
/* 说明: 安装TCP通信相关任务 */
/* 输入: 无 */
/* 输出: 无 */
/* 注释: */
/*******************************************************************/
void InstallTcpTask(void)
{
unsigned long rc;
/*--------------------------------------------*/
/* 建立消息队列和任务 */
/*--------------------------------------------*/
rc = q_create(QN_TCPIPSEND,1024,Q_FIFO|Q_LIMIT|Q_SYSBUF,&ulQidTcpSend);
if ( rc ){
Display("ERR: InstallTcpTask, q_create, errno=0x%X",rc );
return;
}
/*--------------------------------------------*/
/* 产生并启动收发子任务 */
/*--------------------------------------------*/
if( t_create( TN_TCPIPRECV, TASKPRIO0, 8192, 8192,
T_LOCAL, &TidTcpRecv) != 0 )
Display("TkTcpRecv create error!");
if( t_create( TN_TCPIPSEND, TASKPRIO0, 8192, 8192,
T_LOCAL, &TidTcpSend) != 0 )
Display("TkTcpSend create error!");
if( t_create( TN_TCPIPINIT, TASKPRIO1, 8192, 8192,
T_LOCAL, &TidTcpInit) != 0 )
Display("TkTcpInit create error!");
else t_start(TidTcpInit,T_NOPREEMPT|T_NOTSLICE|T_SUPV,TkTcpInitEntry,NULL);
}
void TkTcpInitEntry()
{
long rc;
struct sockaddr_in AgentIP;
unsigned long ulIdx;
static char IsFirst = 0;
int keep_alive,buffsize= 32000;
AgentIP.sin_family = AF_INET;
AgentIP.sin_addr.s_addr = htonl(INADDR_ANY);
AgentIP.sin_port = htons(0x9660);
for (ulIdx= 0; ulIdx< 8; ulIdx++)
AgentIP.sin_zero[ulIdx]= 0;
while(1)
{
if ((SockID = socket(AF_INET,SOCK_STREAM,TCP))==-1)
{
Display("TkTcpInitEntry: socket errno= %X",errno);
continue;
}
/*指定发送缓冲区的长度*/
if ((setsockopt(SockID, SOL_SOCKET, SO_SNDBUF, (char *)&buffsize,sizeof(buffsize))) ==-1)
{
Display("TkTcpInitEntry: set sendbuffer, errno= %X",errno);
continue;
}
/*指定接收缓冲区的长度*/
if ((setsockopt(SockID, SOL_SOCKET, SO_RCVBUF, (char *)&buffsize,sizeof(buffsize))) ==-1)
{
Display("TkTcpInitEntry: set recvbuffer, errno= %X",errno);
continue;
}
if (bind(SockID,(struct sockaddr*)(&AgentIP),sizeof(AgentIP))==-1)
{
Display("TkTcpInitEntry: bind errno= %X",errno);
Display("clsoe: SockID = %d",SockID);
close(SockID);
continue;
}
if (listen(SockID,1)==-1)
{
Display("TkTcpInitEntry: listen errno= %X",errno);
Display("clsoe: SockID = %d",SockID);
close(SockID);
continue;
}
break;
}
while(1)
{
my_Delay(10);/*by xu*/
if(Connected == 0)
{
Display("\nAgent waitting for connection......\n");
if ((SocketID= accept(SockID,(struct sockaddr*)0 ,(int*)0))==-1)
{
Display("Accept err no=%X.....",errno);
continue;
}
keep_alive = ON;
setsockopt(SocketID, SOL_SOCKET, SO_KEEPALIVE,(char *)&keep_alive ,4);
keep_alive = KEEP_ALIVE_CNT;
setsockopt(SocketID, IPPROTO_TCP, TCP_KEEPALIVE_CNT,(char *)&keep_alive ,4);
keep_alive = KEEP_ALIVE_IDLE;
setsockopt(SocketID, IPPROTO_TCP, TCP_KEEPALIVE_IDLE,(char *)&keep_alive,4);
keep_alive = KEEP_ALIVE_INTVL;
setsockopt(SocketID, IPPROTO_TCP, TCP_KEEPALIVE_INTVL,(char *)&keep_alive ,4);
if ((RevSockID= shr_socket(SocketID, TidTcpRecv))==-1)
Display("Err: shr_socket(TidRecv) errno=%X",errno);
if ((SndSockID= shr_socket(SocketID, TidTcpSend))==-1)
Display("Err: shr_socket(TidSend) errno=%X",errno);
close(SocketID);
Connected= 1;
if(IsFirst == 0)
{
t_start(TidTcpRecv,T_NOPREEMPT|T_NOTSLICE|T_SUPV,TkTcpRecvEntry,NULL);
t_start(TidTcpSend,T_NOPREEMPT|T_NOTSLICE|T_SUPV,TkTcpSendEntry,NULL);
IsFirst = 1;
}
else
{
t_restart(TidTcpRecv,0);
t_restart(TidTcpSend,0);
}
Display("Task TK_Server(): Network managment system connected successfully through Ethernet.\n");
}
}
}
/*******************************************************************/
/* 函数名:TkTcpSendEntry */
/* 说明: 数据发送任务 */
/* 输入: */
/* 输出: 无 */
/* 注释: */
/*******************************************************************/
void TkTcpSendEntry()
{
void *pMsg;
int MsgLen;
MESSAGE Msg;
Length_Packet LengthPacket;
long rc;
while(1)
{
/*----------------------------------------*/
/* 检查TCP发送消息队列. */
/*----------------------------------------*/
rc = q_receive(ulQidTcpSend,Q_WAIT,0 ,(unsigned long *)&Msg);
if(rc!=0)
{
Display("ERR: q_receive err=0x%X!", errno);
continue;
}
if(Msg.Flag==0x58585858)
{
close(SndSockID);
Display("tcpip: receive connection close message, stop send!\n");
t_suspend(0L);
}
/*----------------------------------------*/
/* 发送报文长度(8字节) */
/*----------------------------------------*/
LengthPacket.Flag=0xFDFDFDFD;
LengthPacket.Length=Msg.Length;
rc=send(SndSockID,(char *)&LengthPacket,(int)sizeof(Length_Packet),0);
if(rc!=sizeof(Length_Packet))
{
Display("Task TK_ServerSend(): send length packet failed.\n");
}
else
{
rc = send(SndSockID, (char *)Msg.Pdata, (int)Msg.Length, 0 );
if (rc==-1)
{
Display("TkTcpSendEntry: send errno= %X",rc);
continue;
}
else
Display("TkTcpSendEntry: send data len=%d\n",rc);
}
if((Msg.Pdata!=NULL)&&(Msg.MsgType!=MSG_MONI)&&(Msg.MsgType!=MSG_ALRM))
MemFree(Msg.Pdata);
}/*|while|*/
}
/*******************************************************************/
/* 函数名:TkTcpRecvEntry */
/* 说明: 数据接收任务 */
/* 输入: */
/* 输出: 无 */
/* 返回: FAILURE: 失败 */
/* 0 : 成功 */
/* 注释: */
/*******************************************************************/
void TkTcpRecvEntry()
{
unsigned long ulQidDest;
unsigned long MsgBuff[4];
int MsgLen;
unsigned char *pMsg;
unsigned char Buff[4096];
int DataLen;
unsigned long ulEvents;
long rc;
unsigned char NeedReset = 0;
MESSAGE Msg;
/*--------------------------------------------*/
/* 接收程序体 */
/*--------------------------------------------*/
while(1)
{
/*--------------------------------------------*/
/* 等待SOCKET中有数据到来 */
/*--------------------------------------------*/
rc = recv(RevSockID,Buff,1,MSG_PEEK);
if (rc<=0)
{
Display("ERR: TkTcpRecvEntry, Recv(Peek), errno=0x%X.",errno);
close(RevSockID);
Connected= 0;
Msg.Flag=0x58585858;
Msg.Length=0;
Msg.MsgType=0;
Msg.Pdata=NULL;
rc = q_urgent(ulQidTcpSend,(unsigned long *)&Msg);
t_suspend(0);
}
/*--------------------------------------------*/
/* 等待SOCKET中报文数据长度指示的到来 */
/*--------------------------------------------*/
DataLen = 0;
while (DataLen < 8)
{
rc = ioctl(RevSockID,FIOREAD,(char*)&DataLen);
if (rc==-1)
{
Display("ERR: TkTcpRecvEntry, ioctl, errno=0x%X.",errno);
NeedReset= 1;
break;
}
else my_Delay(1);/*by xu*/
}
if (NeedReset==1)
{
close(RevSockID);
Connected= 0;
Msg.Flag=0x58585858;
Msg.Length=0;
Msg.MsgType=0;
Msg.Pdata=NULL;
rc = q_urgent(ulQidTcpSend,(unsigned long *)&Msg);
t_suspend(0);
}
/*--------------------------------------------*/
/* 取得SOCKET中数据长度指示 */
/*--------------------------------------------*/
rc = recv(RevSockID,Buff,8,0);
if (rc<=0)
{
Display("ERR: TkTcpRecvEntry, Recv(head), errno=0x%X.",errno);
close(RevSockID);
Connected= 0;
Msg.Flag=0x58585858;
Msg.Length=0;
Msg.MsgType=0;
Msg.Pdata=NULL;
rc = q_urgent(ulQidTcpSend,(unsigned long *)&Msg);
t_suspend(0);
}
if (*((unsigned long *)Buff)!=0xFDFDFDFD)
{
close(RevSockID);
Connected= 0;
Msg.Flag=0x58585858;
Msg.Length=0;
Msg.MsgType=0;
Msg.Pdata=NULL;
rc = q_urgent(ulQidTcpSend,(unsigned long *)&Msg);
t_suspend(0);
}
MsgLen = *(unsigned long *)(Buff+4);
/*--------------------------------------------*/
/* 如果是握手报文,应答 */
/*--------------------------------------------*/
if (MsgLen==0)
{
MsgBuff[0] = 0;
MsgBuff[1] = 0;
MsgBuff[2] = 0;
rc = q_urgent(ulQidTcpSend,MsgBuff);
continue;
}
Display("INF: Tcp Receive len=%d.", MsgLen);
my_Delay(1);/*by xu*/
pMsg = (unsigned char *)MemAlloc(MsgLen + 1);
if (pMsg == (unsigned char *)NULL)
{
Display("ERR: TkTcpRecvEntry, MemAlloc, No enough memory!");
continue;
}
memset(pMsg, 0, MsgLen + 1);
/*--------------------------------------------*/
/* 接收,直到: SOCKET中报文数据接收完整! */
/*--------------------------------------------*/
DataLen= 0;
while (DataLen < MsgLen)
{
rc = recv(RevSockID,pMsg+ DataLen,MsgLen- DataLen,0);
if (rc>0)
DataLen= DataLen+ rc;
else
{
Display("ERR: TkTcpRecvEntry, Recv, errno=0x%X.",errno);
NeedReset= 1;
break;
}
}
if (NeedReset==1)
{
close(RevSockID);
Connected= 0;
Msg.Flag=0x58585858;
Msg.Length=0;
Msg.MsgType=0;
Msg.Pdata=NULL;
rc = q_urgent(ulQidTcpSend,(unsigned long *)&Msg);
t_suspend(0);
}
/*--------------------------------------------*/
/* 提交数据包:发给Agent处理任务 */
/*--------------------------------------------*/
Cmd_Proc(pMsg);
}/*|while|*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -