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

📄 tcpip.lxc.c

📁 有线电视系统前端设备复用器原代码。 用语接受卫星信号
💻 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 + -