426 lines
9.0 KiB
C
426 lines
9.0 KiB
C
|
|
#include "tcpclient.h"
|
|
|
|
#if (CLIENT_NUM > 0)
|
|
|
|
#include "socket.h"
|
|
#include "inout.h"
|
|
#include "console.h"
|
|
#include "delay.h"
|
|
#include "trigger.h"
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
int g_clinetLinksta; // 物理层连接状态
|
|
int g_clinetLinkCount; // 物理层连接断开计数器
|
|
|
|
|
|
//-------------------------------------------
|
|
|
|
SocketCtrl g_clientSocket[CLIENT_NUM] =
|
|
{
|
|
{TCP_CLIENT, STA_INIT, TCP_CLIENT_SN_BEG+0, TCP_CLIENT_LOCAL_IP, TCP_CLIENT_LOCAL_PORT_BEG+0, TCP_CLIENT_REMOTE_IP_BEG+TCP_CLIENT_REMOTE_IP_ADD*0, TCP_CLIENT_REMOTE_PORT_BEG},
|
|
#if (CLIENT_NUM > 1)
|
|
{TCP_CLIENT, STA_INIT, TCP_CLIENT_SN_BEG+1, TCP_CLIENT_LOCAL_IP, TCP_CLIENT_LOCAL_PORT_BEG+1, TCP_CLIENT_REMOTE_IP_BEG+TCP_CLIENT_REMOTE_IP_ADD*1, TCP_CLIENT_REMOTE_PORT_BEG},
|
|
#endif
|
|
#if (CLIENT_NUM > 2)
|
|
{TCP_CLIENT, STA_INIT, TCP_CLIENT_SN_BEG+2, TCP_CLIENT_LOCAL_IP, TCP_CLIENT_LOCAL_PORT_BEG+2, TCP_CLIENT_REMOTE_IP_BEG+TCP_CLIENT_REMOTE_IP_ADD*2, TCP_CLIENT_REMOTE_PORT_BEG},
|
|
#endif
|
|
#if (CLIENT_NUM > 3)
|
|
{TCP_CLIENT, STA_INIT, TCP_CLIENT_SN_BEG+3, TCP_CLIENT_LOCAL_IP, TCP_CLIENT_LOCAL_PORT_BEG+3, TCP_CLIENT_REMOTE_IP_BEG+TCP_CLIENT_REMOTE_IP_ADD*3, TCP_CLIENT_REMOTE_PORT_BEG},
|
|
#endif
|
|
#if (CLIENT_NUM > 4)
|
|
{TCP_CLIENT, STA_INIT, TCP_CLIENT_SN_BEG+4, TCP_CLIENT_LOCAL_IP, TCP_CLIENT_LOCAL_PORT_BEG+4, TCP_CLIENT_REMOTE_IP_BEG+TCP_CLIENT_REMOTE_IP_ADD*4, TCP_CLIENT_REMOTE_PORT_BEG},
|
|
#endif
|
|
#if (CLIENT_NUM > 5)
|
|
{TCP_CLIENT, STA_INIT, TCP_CLIENT_SN_BEG+5, TCP_CLIENT_LOCAL_IP, TCP_CLIENT_LOCAL_PORT_BEG+5, TCP_CLIENT_REMOTE_IP_BEG+TCP_CLIENT_REMOTE_IP_ADD*5, TCP_CLIENT_REMOTE_PORT_BEG},
|
|
#endif
|
|
#if (CLIENT_NUM > 6)
|
|
{TCP_CLIENT, STA_INIT, TCP_CLIENT_SN_BEG+6, TCP_CLIENT_LOCAL_IP, TCP_CLIENT_LOCAL_PORT_BEG+6, TCP_CLIENT_REMOTE_IP_BEG+TCP_CLIENT_REMOTE_IP_ADD*6, TCP_CLIENT_REMOTE_PORT_BEG},
|
|
#endif
|
|
#if (CLIENT_NUM > 7)
|
|
{TCP_CLIENT, STA_INIT, TCP_CLIENT_SN_BEG+7, TCP_CLIENT_LOCAL_IP, TCP_CLIENT_LOCAL_PORT_BEG+7, TCP_CLIENT_REMOTE_IP_BEG+TCP_CLIENT_REMOTE_IP_ADD*7, TCP_CLIENT_REMOTE_PORT_BEG},
|
|
#endif
|
|
};
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------------------
|
|
|
|
void InitTcpClient(void)
|
|
{
|
|
int i;
|
|
|
|
g_clinetLinksta = LINK_INIT;
|
|
g_clinetLinkCount = 0;
|
|
|
|
for (i = 0; i < CLIENT_NUM; i++)
|
|
{
|
|
g_clientSocket[i].status = STA_CLOSED;
|
|
}
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------------------------------
|
|
|
|
void TcpClientRun(void)
|
|
{
|
|
int i;
|
|
int rslt;
|
|
u8 sn, tmp8;
|
|
u16 port, ir;
|
|
int crsocket;
|
|
u16 sport;
|
|
u32 sip;
|
|
|
|
crsocket = 0;
|
|
|
|
// PHY物理层连接状态检查
|
|
rslt = ctlwizchip(CW_GET_PHYLINK, (void*)(&tmp8));
|
|
|
|
#if (0)
|
|
{
|
|
u32 timer;
|
|
timer = GetMsSoftTimer();
|
|
printf("at%d, TcpClientRun\r\n", timer);
|
|
}
|
|
#endif
|
|
|
|
if(rslt == -1)
|
|
{
|
|
g_clinetLinksta = LINK_INIT;
|
|
printf("Unknown PHY Link stauts.\r\n");
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
if (tmp8 == PHY_LINK_ON)
|
|
{
|
|
if (g_clinetLinksta != LINK_UP)
|
|
{
|
|
crsocket = 1; // 创建socket
|
|
g_clinetLinksta = LINK_UP;
|
|
printf("PHY Link UP.\r\n");
|
|
}
|
|
}
|
|
else if (tmp8 == PHY_LINK_OFF)
|
|
{
|
|
if (g_clinetLinksta == LINK_INIT || g_clinetLinksta == LINK_UP)
|
|
{
|
|
if (g_clinetLinksta == LINK_INIT)
|
|
{
|
|
crsocket = 2; // 关闭socket
|
|
g_clinetLinksta = LINK_DOWN;
|
|
}
|
|
else
|
|
{
|
|
g_clinetLinkCount = 0;
|
|
g_clinetLinksta = LINK_WAIT;
|
|
}
|
|
printf("2. PHY Link DOWN.\r\n");
|
|
}
|
|
else if (g_clinetLinksta == LINK_WAIT)
|
|
{
|
|
g_clinetLinkCount++;
|
|
if (g_clinetLinkCount > 10)
|
|
{
|
|
crsocket = 2; // 关闭socket
|
|
g_clinetLinksta = LINK_DOWN;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
printf("waite PHY connect.\r\n");
|
|
return;
|
|
}
|
|
}
|
|
|
|
// 关闭连接
|
|
if (g_clinetLinksta == LINK_DOWN && crsocket == 2)
|
|
{
|
|
printf("link down or crsocket == 2\r\n");
|
|
for (i = 0; i < CLIENT_NUM; i++)
|
|
{
|
|
if (g_clientSocket[i].status != STA_CLOSED)
|
|
{
|
|
g_clientSocket[i].status = STA_CLOSED;
|
|
printf("close socket %d and disconnect.\r\n", g_clientSocket[i].socket);
|
|
disconnect(g_clientSocket[i].socket);
|
|
close(g_clientSocket[i].socket);
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
// 创建 tcp 客户端
|
|
for (i = 0; i < CLIENT_NUM; i++)
|
|
{
|
|
sn = g_clientSocket[i].socket;
|
|
port = g_clientSocket[i].localPort;
|
|
|
|
tmp8 = getSn_SR(sn);
|
|
switch(tmp8)
|
|
{
|
|
case SOCK_ESTABLISHED: // 建立了连接
|
|
{
|
|
// printf("TCP client socket %d SOCK_ESTABLISHED\r\n", sn);
|
|
|
|
ir = getSn_IR(sn); // 读取中断寄存器
|
|
if ((ir & Sn_IR_CON) != 0)
|
|
{
|
|
g_clientSocket[i].status = STA_CONNECT;
|
|
getsockopt(sn, SO_DESTIP, &sip);
|
|
getsockopt(sn, SO_DESTPORT, &sport);
|
|
printf("TCP client socket %d is connected, destination ip=%d.%d.%d.%d, port=%d\r\n", sn,
|
|
GETIP1(sip), GETIP2(sip), GETIP3(sip), GETIP4(sip), sport);
|
|
setSn_IR(sn, Sn_IR_CON); // 清除中断状态
|
|
}
|
|
break;
|
|
}
|
|
|
|
case SOCK_CLOSE_WAIT: // 如果对方请求关闭当前连接
|
|
{
|
|
printf("TCP client socket %d wait close\r\n", sn);
|
|
disconnect(sn);
|
|
g_clientSocket[i].status = STA_CLOSED;
|
|
break;
|
|
}
|
|
|
|
case SOCK_CLOSED: // 如果是关闭状态
|
|
{
|
|
// 等待建立新的连接
|
|
|
|
printf("TCP client socket %d is closed, create a new socket\r\n", sn);
|
|
rslt = socket(sn, Sn_MR_TCP, port, SF_IO_NONBLOCK); // 创建新连接
|
|
if (rslt == sn)
|
|
{
|
|
printf("Create TCP client success at socket %d\r\n", sn);
|
|
}
|
|
else
|
|
{
|
|
printf("Create TCP client failed at socket %d, code=%d\r\n", sn, rslt);
|
|
}
|
|
break;
|
|
}
|
|
case SOCK_INIT: // 初始化
|
|
{
|
|
sip = g_clientSocket[i].remoteIp;
|
|
sport = g_clientSocket[i].remotePort;
|
|
|
|
printf("TCP client socket %d connect to ip=%d.%d.%d.%d, port=%d\r\n", sn,
|
|
GETIP1(sip), GETIP2(sip), GETIP3(sip), GETIP4(sip), sport);
|
|
|
|
rslt = connect(sn, (u8*)(&sip), sport);
|
|
if (rslt == SOCK_OK)
|
|
{
|
|
g_clientSocket[i].status = STA_READY;
|
|
printf("TCP client socket %d connecting......\r\n", sn);
|
|
}
|
|
else
|
|
{
|
|
// printf("TCP client socket %d connect error, code=%d\r\n", sn, rslt);
|
|
}
|
|
break;
|
|
}
|
|
case SOCK_LISTEN:
|
|
{
|
|
printf("TCP client socket %d SOCK_LISTEN\r\n", sn);
|
|
break;
|
|
}
|
|
case SOCK_SYNSENT:
|
|
{
|
|
printf("TCP client socket %d SOCK_SYNSENT\r\n", sn);
|
|
break;
|
|
}
|
|
case SOCK_SYNRECV:
|
|
{
|
|
printf("TCP client socket %d SOCK_SYNRECV\r\n", sn);
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
// printf("default, TCP client socket %d status=0x%x\r\n", sn, tmp8);
|
|
break;
|
|
}
|
|
} // end of switch
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
|
|
void CreateTcpClient(void)
|
|
{
|
|
int i;
|
|
int rslt;
|
|
u8 sn, tmp8;
|
|
u16 port;
|
|
for (i = 0; i < 8; i++)
|
|
{
|
|
if (g_clientSocket.status != STA_CLOSED)
|
|
{
|
|
printf("tcp clinet not closed\r\n");
|
|
return;
|
|
}
|
|
|
|
sn = g_clientSocket.socket;
|
|
port = g_clientSocket.port;
|
|
|
|
tmp8 = SF_IO_NONBLOCK;
|
|
rslt = socket(sn, Sn_MR_TCP, port, tmp8);
|
|
if (rslt == sn)
|
|
{
|
|
g_clientSocket.status = STA_READY;
|
|
printf("create tcp client success\r\n");
|
|
}
|
|
else
|
|
{
|
|
printf("create tcp client failed\r\n");
|
|
}
|
|
}
|
|
}
|
|
|
|
void ConnectTcpClient(void)
|
|
{
|
|
int rslt;
|
|
u8 sn;
|
|
u16 port;
|
|
u32 ipaddr;
|
|
if (g_clientSocket.status != STA_READY)
|
|
{
|
|
printf("tcp clinet not ready\r\n");
|
|
return;
|
|
}
|
|
|
|
sn = g_clientSocket.socket;
|
|
ipaddr = PLC_SERVER_IP;
|
|
port = PLC_SERVER_PORT;
|
|
|
|
rslt = connect(sn, (u8*)(&ipaddr), port);
|
|
if (rslt == SOCK_OK)
|
|
{
|
|
g_clientSocket.status = STA_CONNECT;
|
|
printf("connect server success......\r\n");
|
|
}
|
|
else if (rslt == SOCKERR_SOCKNUM)
|
|
{
|
|
printf("Invalid socket number\r\n");
|
|
}
|
|
else if (rslt == SOCKERR_SOCKMODE)
|
|
{
|
|
printf("Invalid socket mode\r\n");
|
|
}
|
|
else if (rslt == SOCKERR_SOCKINIT)
|
|
{
|
|
printf("Socket is not initialized\r\n");
|
|
}
|
|
else if (rslt == SOCKERR_IPINVALID)
|
|
{
|
|
printf("Wrong server IP address\r\n");
|
|
}
|
|
else if (rslt == SOCKERR_PORTZERO)
|
|
{
|
|
printf("Server port zero\r\n");
|
|
}
|
|
else if (rslt == SOCKERR_TIMEOUT)
|
|
{
|
|
printf("Timeout occurred during request connection\r\n");
|
|
}
|
|
else // if (rslt == SOCK_BUSY)
|
|
{
|
|
printf("0. socket is busy\r\n");
|
|
}
|
|
}
|
|
*/
|
|
|
|
void TestNetTrans(void)
|
|
{
|
|
int i[8], sta[8], rslt;
|
|
int j;
|
|
u8 buff[MAX_TRANS_DATA];
|
|
|
|
memset(i, 0, sizeof(int)*8);
|
|
memset(sta, 0, sizeof(int)*8);
|
|
memset(buff, 0x5A, MAX_TRANS_DATA);
|
|
|
|
do
|
|
{
|
|
if (IsConsoleCancel() != 0)
|
|
{
|
|
printf("send cancel\r\n");
|
|
break;
|
|
}
|
|
|
|
for (j = 0; j < CLIENT_NUM; j++)
|
|
{
|
|
if (g_clientSocket[j].status == STA_CONNECT)
|
|
{
|
|
if (sta[j] == 0)
|
|
{
|
|
if (i[j]%10 == 0)
|
|
{
|
|
printf("socket %d send data from tcp client to server %d times\r\n", g_clientSocket[j].socket, i[j]);
|
|
}
|
|
if (i[j]%2 == 0)
|
|
{
|
|
SetLedOn();
|
|
}
|
|
else
|
|
{
|
|
SetLedOff();
|
|
}
|
|
|
|
sta[j] = 1;
|
|
}
|
|
|
|
if (sta[j] == 1)
|
|
{
|
|
rslt = EthernetSendData(&(g_clientSocket[j]), buff, MAX_TRANS_DATA);
|
|
if (rslt != MAX_TRANS_DATA)
|
|
{
|
|
continue;
|
|
}
|
|
// printf("send data %d times success\r\n", i);
|
|
sta[j] = 0;
|
|
i[j]++;
|
|
}
|
|
}
|
|
}
|
|
}while(1);
|
|
|
|
}
|
|
#endif
|
|
|
|
SocketCtrl * GetTcpClientCtrlFromSocketId(int sIdx)
|
|
{
|
|
#if (CLIENT_NUM > 0)
|
|
if (sIdx < CLIENT_NUM)
|
|
{
|
|
return &(g_clientSocket[sIdx]);
|
|
}
|
|
else
|
|
#endif
|
|
{
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
int IsClinetConnect(int sIdx)
|
|
{
|
|
#if (CLIENT_NUM > 0)
|
|
if (sIdx < CLIENT_NUM)
|
|
{
|
|
return g_clientSocket[sIdx].status;
|
|
}
|
|
else
|
|
#endif
|
|
{
|
|
return -1;
|
|
}
|
|
}
|
|
|