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

📄 tcpip.c

📁 有线电视系统前端设备复用器原代码。 用语接受卫星信号
💻 C
字号:
/*------------------------------------------------------------------------------*/
/* Project Name: Multiplexer of MPEG-II                                         */
/* Module  Name: */
/* Purpose     :                                                                */
/* Author      : LingYiChuan                                                    */
/* Date        : 2000/9/20                                                      */
/* Version     : 1.0                                                            */
/* Copyright HignSun Dvision, All Right Reservered.                             */
/*------------------------------------------------------------------------------*/
#include "constant.h"
#include "structure.h"
#include "command.h"
#include "tspack.h"
#include "pna.h"
#include "psos.h"
extern void my_Delay(unsigned long int dly_ms);

#define CONSOLE_PORT   0x9660

extern  unsigned char Connected;

int     RecvSockID,SendSockID;
unsigned long	tid_send,tid_recv;


extern unsigned char TCPIP_First_Run;

extern unsigned char Has_Report_Device_Type;


void TK_ServerSend(void)
{
	unsigned long rc;
	MESSAGE       Msg;
	Length_Packet LengthPacket;

	for(;;)
	{
		/*接收到发送请求*/
		rc=ReceiveQueue(QN_TCPIPSEND,Q_WAIT,0,&Msg);
		if(rc)
		{
			my_Delay(100);			/*by xu*/
			Display("TK_ServerSend(): receive message failed!\n");
			continue;
		}
		else
		{
			if((Msg.Flag==0x58585858)||!Connected)
			{
				close(SendSockID);
				Display("TK_ServerSend(): receive connection close message, stop send!\n"); 
				t_suspend(0L);
			}
			/*----------------------------------------------------------------------------*/
			/* 先发送数据长度的包                                                         */
			/*----------------------------------------------------------------------------*/
			LengthPacket.Flag=0xFDFDFDFD;
			LengthPacket.Length=Msg.Length;
			
			rc = send(SendSockID,(char *)&LengthPacket,(int)sizeof(Length_Packet),0);
			if(rc!=sizeof(Length_Packet))
			{
				Display("Task TK_ServerSend(): send length packet failed, error code=0x%x.\n",errno);
			}
			else
			{
				/*-----------------------------------------------------------------------*/
				/* 如果是探测包应答,不用发送数据。                                      */
				/*-----------------------------------------------------------------------*/
				if(Msg.Length==0 || Msg.Pdata == NULL)
					continue;
				/*else if((Msg.Length>65562)||((unsigned long)Msg.Pdata>0x2000000)||((unsigned long)Msg.Pdata<=0))(*/
				else if((Msg.Length>128*1024)||((unsigned long)Msg.Pdata>0x2000000)||((unsigned long)Msg.Pdata<=0))
				{
					Display("error msg to send from ethernet,msg.Length=%d,Msg.Pdata=%d,msg.flag=%d,msg.type=%d!\r\n",Msg.Length,(unsigned long)Msg.Pdata,Msg.Flag,Msg.MsgType);	
					continue;
				}
				/*-----------------------------------------------------------------------*/
				/* 发送数据包                                                            */
				/*-----------------------------------------------------------------------*/
				rc=send(SendSockID,(char *)Msg.Pdata,(int)Msg.Length,0);
				if(rc!=Msg.Length)
				{
					Display("Task TK_ServerSend(): send data  packet failed, error code=0x%x.\n",errno);
				}
				else
				{
					/*Display("Task TK_ServerSend(): send data length=%d.\n",rc);*/
				}
			}
		}

		if((Msg.Pdata!=NULL)&&(Msg.MsgType!=MSG_MONI)&&(Msg.MsgType!=MSG_ALRM))
			MemFree(Msg.Pdata);

		my_Delay(100);/*by xu*/
	}

}

void SendDetectReply(void)
{
	MESSAGE  Msg;

	Msg.Flag    =0;
	Msg.MsgType =MSG_REPLY;
	Msg.Length  =0;
	Msg.Pdata	=NULL;

	Display("A TCPIP detect reply packet send out! \n");

	SendQueue(QN_TCPIPSEND,&Msg);
}

void TK_ServerRecv(void)
{
	long volatile rc;
	unsigned long tid_send;

	unsigned long TotalLen, RecvLen, RestLen;

	Length_Packet LengthPacket;
	Packet        *P;
	unsigned char *buf;

	MESSAGE       Msg;

	for(;;)
	{
		/*----------------------------------------------------------------------------*/
		/* 先接收数据长度的包                                                         */
		/*----------------------------------------------------------------------------*/
		rc=recv(RecvSockID,(char *)&LengthPacket,(int)sizeof(Length_Packet),0);
		if((rc!=sizeof(Length_Packet))||(LengthPacket.Flag!=0xFDFDFDFD))
		{
			if(rc<=0)
			{/*发送探测包进行检测*/
				Display("TK_ServerRecv(): receive a data length packet failed, error code=0x%x, The connection will be reset.\n",errno);
				rc=close(RecvSockID);
				if(rc)
					Display("TK_ServerRecv(): close socket failed. errno=0x%X\n",errno);
				
				Msg.Flag=0x58585858;
				Msg.Length=0;
				Msg.MsgType=0;
				Msg.Pdata=NULL;

				SendQueueUrgent(QN_TCPIPSEND,&Msg);								
				Connected=FALSE;
				t_suspend(0L);
			}

		}
		else
		{
			if(LengthPacket.Length==0)
			{
				/*----------------------------------------------------------------*/
				/* 收到了一个探测包,需要给它一个应答                             */
				/*----------------------------------------------------------------*/				
				/*SendDetectReply();*/

				continue;
			}
			P=(Packet *)MemAlloc(RNG1ID,TN_TCPIPRECV,LengthPacket.Length);

			if(P!=NULL)
			{
				TotalLen=0;
				RestLen=LengthPacket.Length-TotalLen;
				buf=(unsigned char *)P;

				while(1)
				{
					/*--------------------------------------------------------------------*/
					/* 接收数据包                                                         */
					/*--------------------------------------------------------------------*/				
					rc=recv(RecvSockID,(char *)buf,(int)LengthPacket.Length,0);
				
					if(rc<=0)
					{
						Display("TK_ServerRecv(): receive a data packet failed, error code=0x%x, The connection will be reset.\n",errno);

						rc=close(RecvSockID);
						if(rc)
							Display("TK_ServerRecv(): close socket failed. errno=0x%x\n",errno);

						MemFree(P);

						Msg.Flag=0x58585858;
						Msg.Length=0;
						Msg.MsgType=0;
						Msg.Pdata=NULL;

						SendQueueUrgent(QN_TCPIPSEND,&Msg);
						Connected=FALSE;					
						t_suspend(0L);
					}

					RecvLen=rc;

					TotalLen+=RecvLen;

					if(TotalLen>=LengthPacket.Length) 
						break;

					buf+=RecvLen;

					my_Delay(5);
				}

				/*确认命令类型,进行相应处理*/
				Cmd_Proc(P); 
			}

		}
		
	}
}

/*创建服务器任务*/
void TK_ServerInit(void)
{
	unsigned long   TcpipSendQid;
	int 			ServerSocketFd , s ,i,ConsoleAddrLen;					 
	long 			volatile rc ;
	struct 			sockaddr_in ConsoleAddr, MultiplexerAddr;

	unsigned long   RcvBufLen,SendBufLen;

	unsigned long   IsKeepAlvie;
	unsigned long   KeepAliveCnt;
	unsigned long   KeepAliveIdleTime;
	unsigned long   KeepAliveTime;

	struct linger   LingerVal;

	/*--------------------------------------------------------------------------*/
	/*创建发送和接收任务                                                        */
	/*--------------------------------------------------------------------------*/
	CreateQueue(QN_TCPIPSEND,&TcpipSendQid);

	for(;;)
	{
		if(t_create(TN_TCPIPRECV, TASKPRIO0, SUPERSTACK, USERSTACK, T_LOCAL, &tid_recv) != 0 )
		{
			Display("tcpip: create tcp recv task error, error code=0x%x\n",errno);
			continue;
		}

		if(t_create(TN_TCPIPSEND, TASKPRIO0, SUPERSTACK, USERSTACK, T_LOCAL, &tid_send) != 0 )
		{
			Display("tcpip: create tcp send task error, error code=0x%x\n",errno);
			continue;
		}

		my_Delay(10);/*by xu*/

		break;
	}
	/*--------------------------------------------------------------------------*/
	/* 创建TCP协议的套接字.							                            */
	/*--------------------------------------------------------------------------*/	
	ConsoleAddrLen=sizeof(ConsoleAddr);

	MultiplexerAddr.sin_family		= AF_INET;					 
	MultiplexerAddr.sin_port		= htons(CONSOLE_PORT);			 
	MultiplexerAddr.sin_addr.s_addr = htonl(INADDR_ANY);	 
	for(i=0;i<8;i++)
		MultiplexerAddr.sin_zero[i] = 0;					 

	SendBufLen=32*1024;
	RcvBufLen =32*1024;

	for(;;)
	{	
		/*创建套接口*/
		s = socket(AF_INET, SOCK_STREAM, TCP);
		if(s == -1) 
		{
			my_Delay(10);	/*by xu*/
			Display("tcpip: socket create error, error code=0x%x\n",errno);
			continue;
		}

		/*设置套接口接收缓存*/
		rc=setsockopt(s,SOL_SOCKET,SO_RCVBUF,(char *)&RcvBufLen,4);
		if(rc==-1)
		{
			my_Delay(10);	/*by xu*/
			Display("tcpip: socket set sendbuf option error, error code=0x%x\n",errno);
			close(s);
			continue;
		}

	       /*设置套接口发送缓存*/
		rc=setsockopt(s,SOL_SOCKET,SO_SNDBUF,(char *)&SendBufLen,4);
		if(rc==-1)
		{
			my_Delay(10);	/*by xu*/
			Display("tcpip: socket set recvbuf error, error code=0x%x\n",errno);
			close(s);
			continue;
		}

		/*绑定IP服务器地地址*/
		rc = bind(s, (struct sockaddr *)&MultiplexerAddr, sizeof(MultiplexerAddr));
		if(rc == -1)
		{
			my_Delay(10);			 /*by xu*/
			Display("tcpip: socket bind error, error code=0x%x\n",errno);
			close(s);
			continue;
		}

		/*服务器开始监听*/
		rc = listen(s,1);
		if(rc == -1)
		{
			my_Delay(10);/*by xu*/
			Display("tcpip: socket listen error, error code=0x%x\n",errno);
			close(s);
			continue;
		}

		break;
	}

	for(;;)
	{
		Connected=FALSE;

		/*接收连接,获得新的套接口描述字*/
		ServerSocketFd = accept(s, (struct sockaddr *)&ConsoleAddr, (int *)&ConsoleAddrLen);
		if(ServerSocketFd==-1)
		{
			Display("Task TK_ServerInit()  accept failed. errno=0x%X\n",errno);
	 		my_Delay(10);	/*by xu*/
			continue;
		}

		Has_Report_Device_Type=0;

		IsKeepAlvie      =1;
		KeepAliveCnt     =2;
		KeepAliveIdleTime=3;
		KeepAliveTime    =3;
		
		/*
		LingerVal.l_onoff =1;
		LingerVal.l_linger=10;
		*/

		rc=setsockopt(ServerSocketFd,SOL_SOCKET,SO_KEEPALIVE,(char *)&IsKeepAlvie,4);		
		rc=setsockopt(ServerSocketFd,IPPROTO_TCP,TCP_KEEPALIVE_CNT,(char *)&KeepAliveCnt,4);
		rc=setsockopt(ServerSocketFd,IPPROTO_TCP,TCP_KEEPALIVE_IDLE,(char *)&KeepAliveIdleTime,4);
		rc=setsockopt(ServerSocketFd,IPPROTO_TCP,TCP_KEEPALIVE_INTVL,(char *)&KeepAliveTime,4);
		/*rc=setsockopt(ServerSocketFd,SOL_SOCKET,SO_LINGER,(char *)&LingerVal,sizeof(struct linger));*/

		for (;;) 
		{
			/*获得新的套接口ID,并使之与一个任务ID相关联*/
			if ((RecvSockID = shr_socket(ServerSocketFd, tid_recv)) >= 0)
			{				
				break;
			}
			my_Delay(10);/*by xu*/
		}

		for (;;) 
		{
			/*获得新的套接口ID,并使之与一个任务ID相关联*/
			if ((SendSockID = shr_socket(ServerSocketFd, tid_send)) >= 0)
			{				
				break;
			}
			my_Delay(10);/*by xu*/
		}

		/*关闭当前的套接口*/
		close(ServerSocketFd);

		my_Delay(10);/*by xu*/

		if(TCPIP_First_Run)
		{
			/*启动数据接收和发送任务*/
			t_start(tid_recv,T_NOPREEMPT|T_NOTSLICE|T_SUPV,TK_ServerSend,NULL);
			t_start(tid_send,T_NOPREEMPT|T_NOTSLICE|T_SUPV,TK_ServerRecv,NULL);

			TCPIP_First_Run=FALSE;
		}
		else
		{
			/*--------------------------------------------------------------------------*/
			/*删除队列,然后重新创建一个队列                                            */
			/*--------------------------------------------------------------------------*/
			DeleteQueue(QN_TCPIPSEND);
			CreateQueue(QN_TCPIPSEND,&TcpipSendQid);

			t_restart(tid_recv,0);
			t_restart(tid_send,0);
		}

		my_Delay(10);/*by xu*/

		Connected=TRUE;

		Display("Task TK_Server(): Network managment system connected successfully through Ethernet.\n");

		while(Connected)
		{
			my_Delay(1000);/*by xu*/
		}
	}
	
	t_suspend(0L);
}

⌨️ 快捷键说明

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