389 lines
7.6 KiB
C
389 lines
7.6 KiB
C
|
|
|
|||
|
|
#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
|