optical/NxFuncs/network/tcpserver.c

389 lines
7.6 KiB
C
Raw Permalink Normal View History

2025-09-04 01:45:08 +00:00
#include "tcpserver.h"
#if (SERVER_NUM > 0)
// TCP server
#include "socket.h"
#include "inout.h"
//---------------------------------------------------------------
int g_linksta; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
int g_linkCount; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӶϿ<D3B6><CFBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------
SocketCtrl g_serverSocket[SERVER_NUM] =
{
{TCP_SERVER, STA_INIT, TCP_SERVER_SN_BEG+0, TCP_SERVER_LOCAL_IP_BEG+TCP_SERVER_LOCAL_IP_ADD*0, TCP_SERVER_PORT_BEG+0, 0, 0},
#if (SERVER_NUM > 1)
{TCP_SERVER, STA_INIT, TCP_SERVER_SN_BEG+1, TCP_SERVER_LOCAL_IP_BEG+TCP_SERVER_LOCAL_IP_ADD*1, TCP_SERVER_PORT_BEG+0, 0, 0},
#endif
#if (SERVER_NUM > 2)
{TCP_SERVER, STA_INIT, TCP_SERVER_SN_BEG+2, TCP_SERVER_LOCAL_IP_BEG+TCP_SERVER_LOCAL_IP_ADD*2, TCP_SERVER_PORT_BEG+0, 0, 0},
#endif
#if (SERVER_NUM > 3)
{TCP_SERVER, STA_INIT, TCP_SERVER_SN_BEG+3, TCP_SERVER_LOCAL_IP_BEG+TCP_SERVER_LOCAL_IP_ADD*3, TCP_SERVER_PORT_BEG+0, 0, 0},
#endif
#if (SERVER_NUM > 4)
{TCP_SERVER, STA_INIT, TCP_SERVER_SN_BEG+4, TCP_SERVER_LOCAL_IP_BEG+TCP_SERVER_LOCAL_IP_ADD*4, TCP_SERVER_PORT_BEG+0, 0, 0},
#endif
#if (SERVER_NUM > 5)
{TCP_SERVER, STA_INIT, TCP_SERVER_SN_BEG+5, TCP_SERVER_LOCAL_IP_BEG+TCP_SERVER_LOCAL_IP_ADD*5, TCP_SERVER_PORT_BEG+0, 0, 0},
#endif
#if (SERVER_NUM > 6)
{TCP_SERVER, STA_INIT, TCP_SERVER_SN_BEG+6, TCP_SERVER_LOCAL_IP_BEG+TCP_SERVER_LOCAL_IP_ADD*6, TCP_SERVER_PORT_BEG+0, 0, 0},
#endif
#if (SERVER_NUM > 7)
{TCP_SERVER, STA_INIT, TCP_SERVER_SN_BEG+7, TCP_SERVER_LOCAL_IP_BEG+TCP_SERVER_LOCAL_IP_ADD*7, TCP_SERVER_PORT_BEG+0, 0, 0},
#endif
};
void InitTcpServer(void)
{
int i;
for (i = 0; i < SERVER_NUM; i++)
{
g_serverSocket[i].status = STA_CLOSED;
}
g_linksta = LINK_INIT;
g_linkCount = 0;
}
void SetTcpKeepAlive(void)
{
int i;
uint8_t alivetime = 1;
for (i = 0; i < SERVER_NUM; i++)
{
setsockopt(g_serverSocket[i].socket, SO_KEEPALIVEAUTO, &alivetime);
printf("enable socket %d auto keep alive\r\n", g_serverSocket[i].socket);
}
}
void TcpServerRun(void)
{
int i;
int rslt;
int crsocket;
u8 sn, tmp8;
u16 port, ir;
crsocket = 0;
// PHY<48><59><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD>
rslt = ctlwizchip(CW_GET_PHYLINK, (void*)(&tmp8));
if (1) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>ȶ<EFBFBD><C8B6><EFBFBD><EFBFBD><EFBFBD>
{
int tprslt, retry;
u8 temp;
retry = 10;
do
{
tprslt = ctlwizchip(CW_GET_PHYLINK, (void*)(&temp));
if (rslt != tprslt)
{
printf("1. net link rslt = %d\r\n", tprslt);
break;
}
else
{
if (temp != tmp8)
{
printf("1. net link sta = 0x%x, old=0x%x\r\n", temp, tmp8);
break;
}
}
retry--;
}while(retry > 0);
if (retry != 0)
{
return;
}
}
if (rslt == -1)
{
g_linksta = LINK_INIT;
printf("Unknown PHY Link stauts.\r\n");
return;
}
else
{
if (tmp8 == PHY_LINK_ON)
{
if (g_linksta != LINK_UP)
{
crsocket = 1; // <20><><EFBFBD><EFBFBD>socket
g_linksta = LINK_UP;
printf("PHY Link UP.\r\n");
g_linkCount = 0;
}
}
else if (tmp8 == PHY_LINK_OFF)
{
if (g_linksta == LINK_INIT || g_linksta == LINK_UP)
{
if (g_linksta == LINK_INIT)
{
crsocket = 2; // <20>ر<EFBFBD>socket
g_linksta = LINK_DOWN;
printf("1. PHY Link DOWN.\r\n");
}
else
{
g_linkCount = 0;
g_linksta = LINK_WAIT;
printf("1. PHY Link WAIT.\r\n");
}
}
else if (g_linksta == LINK_WAIT)
{
printf("2. PHY Link WAIT.\r\n");
g_linkCount++;
if (g_linkCount > 10) // <20>Ͽ<EFBFBD><CFBF><EFBFBD>ʱ
{
crsocket = 2; // <20>ر<EFBFBD>socket
g_linksta = LINK_DOWN;
printf("1. PHY Link DOWN.\r\n");
}
}
else if (g_linksta == LINK_DOWN)
{
}
else
{
printf("other Link sta.\r\n");
}
}
else
{
printf("waite PHY connect.\r\n");
return;
}
}
// <20>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
if (g_linksta == LINK_DOWN && crsocket == 2)
{
for (i = 0; i < SERVER_NUM; i++)
{
if (g_serverSocket[i].status != STA_CLOSED)
{
g_serverSocket[i].status = STA_CLOSED;
printf("Close TCP server socket %d and disconnect.\r\n", g_serverSocket[i].socket);
disconnect(g_serverSocket[i].socket);
close(g_serverSocket[i].socket);
}
}
return;
}
// tcp <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (i = 0; i < SERVER_NUM; i++)
{
sn = g_serverSocket[i].socket;
port = g_serverSocket[i].localPort;
tmp8 = getSn_SR(sn);
if (1) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>ȶ<EFBFBD><C8B6><EFBFBD><EFBFBD><EFBFBD>
{
int retry;
u8 temp;
retry = 10;
do
{
temp = getSn_SR(sn);
if (temp != tmp8)
{
printf("1. socket %d sr = 0x%x, old=0x%x\r\n", sn, temp, tmp8);
break;
}
retry--;
}while(retry > 0);
if (retry != 0)
{
return;
}
}
switch(tmp8)
{
case SOCK_ESTABLISHED: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
ir = getSn_IR(sn); // <20><>ȡ<EFBFBD>жϼĴ<CFBC><C4B4><EFBFBD>
if ((ir & Sn_IR_CON) != 0)
{
u32 ip;
u16 port;
g_serverSocket[i].status = STA_CONNECT;
getsockopt(sn, SO_DESTIP, &ip);
getsockopt(sn, SO_DESTPORT, &port);
printf("TCP server is connected to socket %d, destination ip=%d.%d.%d.%d, port=%d\r\n", sn,
GETIP1(ip), GETIP2(ip), GETIP3(ip), GETIP4(ip), port);
setSn_IR(sn, Sn_IR_CON); // <20><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>״̬
}
if((ir & Sn_IR_CON) != 0) // <20><><EFBFBD><EFBFBD>
{
}
if ((ir & Sn_IR_DISCON) != 0) // <20>Ͽ<EFBFBD>
{
}
if ((ir & Sn_IR_RECV) != 0) // <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>
{
}
if ((ir & Sn_IR_TIMEOUT) != 0) // <20><>ʱ
{
}
if ((ir & Sn_IR_SENDOK) != 0) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
}
break;
}
case SOCK_CLOSE_WAIT: // <20><><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>رյ<D8B1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
{
rslt = disconnect(sn);
close(sn);
printf("TCP server socket %d wait close, rslt=%d\r\n", sn, rslt);
// if (rslt == SOCK_OK)
{
g_serverSocket[i].status = STA_CLOSED;
}
break;
}
case SOCK_CLOSED: // <20><><EFBFBD><EFBFBD><EFBFBD>ǹر<C7B9>״̬
{
printf("TCP server socket %d is closed, create a new socket\r\n", sn);
rslt = socket(sn, Sn_MR_TCP, port, SF_IO_NONBLOCK|0); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SF_TCP_NODELAY
if(rslt == sn)
{
printf("TCP server socket %d create success\r\n", sn);
}
else
{
printf("Create TCP server socket %d failed, code=%d\r\n", sn, rslt);
if (rslt == SOCKERR_SOCKINIT)
{
printf("Re Init Network\r\n");
InitNetConfig(); // <20><><EFBFBD><EFBFBD>оƬ<D0BE><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
}
break;
}
case SOCK_INIT: // <20><>ʼ<EFBFBD><CABC>
{
rslt = listen(sn);
if (rslt == SOCK_OK)
{
g_serverSocket[i].status = STA_READY;
printf("TCP server socket %d Listening......\r\n\tserver ip= %d.%d.%d.%d, port=%d\r\n", \
sn, g_netInfo.ip[0],g_netInfo.ip[1],g_netInfo.ip[2],g_netInfo.ip[3], port);
}
else
{
printf("TCP server socket %d Listen error, code=%d\r\n", sn, rslt);
}
break;
}
case SOCK_LISTEN:
{
break;
}
default:
{
/*
SOCK_SYNSENT 0x15
SOCK_SYNRECV 0x16
SOCK_ESTABLISHED 0x17
SOCK_FIN_WAIT 0x18
SOCK_CLOSING 0x1A
SOCK_TIME_WAIT 0x1B
SOCK_CLOSE_WAIT 0x1C
SOCK_LAST_ACK 0x1D
SOCK_UDP 0x22
SOCK_MACRAW 0x42
*/
if (tmp8 != 0)
{
printf("TCP server default, getSn_SR=0x%x\r\n", tmp8);
}
break;
}
} // end of switch
}
}
SocketCtrl * GetTcpServerCtrlFromSocketId(int sIdx)
{
if (sIdx < SERVER_NUM)
{
return &(g_serverSocket[sIdx]);
}
else
{
return NULL;
}
}
#if (0)
void TcpServerGetData(void)
{
int i;
int len, rslt, expt;
u8 buff[MAX_TRANS_DATA];
for (i = 0; i < SERVER_NUM; i++)
{
len = EthernetGetRsLen(&(g_serverSocket[i]));
if (len != 0)
{
printf("receive data from socket%d, len=%d\r\n", g_serverSocket[i].socket, len);
}
while (len != 0)
{
if (len > MAX_TRANS_DATA)
{
expt = MAX_TRANS_DATA;
}
else
{
expt = len;
}
rslt = EthernetGetData(&(g_serverSocket[i]), buff, expt);
if (rslt == expt)
{
len -= expt;
}
else
{
printf("receive data error\r\n");
}
}
}
}
#endif
#endif