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; // 物理层连接状态
|
|
int g_linkCount; // 物理层连接断开计数器
|
|
|
|
//-------------------------------------------
|
|
|
|
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物理层连接状态检查
|
|
rslt = ctlwizchip(CW_GET_PHYLINK, (void*)(&tmp8));
|
|
|
|
if (1) // 连续读取稳定数据
|
|
{
|
|
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; // 创建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; // 关闭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) // 断开超时
|
|
{
|
|
crsocket = 2; // 关闭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;
|
|
}
|
|
}
|
|
|
|
// 关闭连接
|
|
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 服务器
|
|
for (i = 0; i < SERVER_NUM; i++)
|
|
{
|
|
sn = g_serverSocket[i].socket;
|
|
port = g_serverSocket[i].localPort;
|
|
tmp8 = getSn_SR(sn);
|
|
|
|
if (1) // 连续读取稳定数据
|
|
{
|
|
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: // 建立了连接
|
|
{
|
|
ir = getSn_IR(sn); // 读取中断寄存器
|
|
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); // 清除中断状态
|
|
}
|
|
|
|
if((ir & Sn_IR_CON) != 0) // 连接
|
|
{
|
|
}
|
|
|
|
if ((ir & Sn_IR_DISCON) != 0) // 断开
|
|
{
|
|
}
|
|
|
|
if ((ir & Sn_IR_RECV) != 0) // 接收到数据
|
|
{
|
|
}
|
|
|
|
if ((ir & Sn_IR_TIMEOUT) != 0) // 超时
|
|
{
|
|
}
|
|
|
|
if ((ir & Sn_IR_SENDOK) != 0) // 发送完成
|
|
{
|
|
}
|
|
break;
|
|
}
|
|
|
|
case SOCK_CLOSE_WAIT: // 如果对方请求关闭当前连接
|
|
{
|
|
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: // 如果是关闭状态
|
|
{
|
|
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); // 创建新连接 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(); // 重启芯片并重新配置
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
case SOCK_INIT: // 初始化
|
|
{
|
|
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
|