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