使用 CH579单独实现TCP服务器通信 或 UDP服务器通信都正常
在CH579上同时使用TCP服务器和UDP服务器的时候,TCP服务器能正常工作,UDP服务器收发成功1次后,就再也无法通信了? CH579的网络协议栈不能同时支持 TCP和UDP服务器吗?
void CH57xNET_CreatTcpSocket(void)
{
UINT8 i;
SOCK_INF TmpSocketInf;
/* 创建临时socket变量 */
printf("Tcp port:%d\r\n", CARD_CFG_TCP_PORT);
memset((void *)&TmpSocketInf,0,sizeof(SOCK_INF)); /* 库内部会将此变量复制,所以最好将临时变量先全部清零 */
TmpSocketInf.SourPort = CARD_CFG_TCP_PORT; /* 设置源端口 */
TmpSocketInf.ProtoType = PROTO_TYPE_TCP; /* 设置socekt类型 */
TmpSocketInf.RecvStartPoint = (UINT32)SocketRecvBuf; /* 设置接收缓冲区的接收缓冲区 */
TmpSocketInf.RecvBufLen = RECE_BUF_LEN ; /* 设置接收缓冲区的接收长度 */
i = CH57xNET_SocketCreat(&gSerSocketId,&TmpSocketInf); /* 创建socket,将返回的socket索引保存在SocketId中 */
mStopIfError(i); /* 检查错误 */
#ifdef KEEPLIVE_ENABLE
CH57xNET_SocketSetKeepLive(gSerSocketId, 1 ); /* 开启socket的KEEPLIVE功能(V06版本支持) */
#endif
i = CH57xNET_SocketListen(gSerSocketId); /* TCP连接 */
mStopIfError(i); /* 检查错误 */
i = CH57xNET_SetSocketTTL(gSerSocketId,128 );
mStopIfError(i); /* 检查错误 */
}
void CH57xNET_CreatUdpSocket(void)
{
UINT8 i;
SOCK_INF TmpSocketInf; /* 创建临时socket变量 */
//创建UDP socket目的IP和端口号任意设定
UINT8 DESIP[4] = {255,255,255,255};
memset((void *)&TmpSocketInf,0,sizeof(SOCK_INF)); /* 库内部会将此变量复制,所以最好将临时变量先全部清零 */
memcpy((void *)TmpSocketInf.IPAddr,DESIP,4); /* 设置目的IP地址 */
TmpSocketInf.DesPort = 2000; /* 设置目的端口 */
TmpSocketInf.SourPort = UDP_LOCAL_DEFAULT_PORT; /* 设置源端口 */
TmpSocketInf.ProtoType = PROTO_TYPE_UDP; /* 设置socekt类型 */
TmpSocketInf.AppCallBack = CH57xNET_UdpServerRecv; /* 接收回调函数 */
TmpSocketInf.RecvStartPoint = (UINT32)SocketRecvBuf[0]; /* 设置接收缓冲区的接收缓冲区 */
TmpSocketInf.RecvBufLen = RECE_BUF_LEN ; /* 设置接收缓冲区的接收长度 */
i = CH57xNET_SocketCreat(&gUdpSocketId,&TmpSocketInf); /* 创建socket,将返回的socket索引保存在SocketId中 */
mStopIfError(i); /* 检查错误 */
}
void Ch579EthInit(void)
{
UINT8 iret = 0;
UINT8 myIpAddr[4]={0};
UINT8 myGwIpAddr[4]={0};
UINT8 myGwIpMask[4]={0};
printf("IP_ADDR:%x\r\n", CARD_CFG_ETH_IP);
//printf("MASK:%x\r\n", CARD_CFG_ETH_MASK);
myIpAddr[0] = (CARD_CFG_ETH_IP>>24)&0xff;
myIpAddr[1] = (CARD_CFG_ETH_IP>>16)&0xff;
myIpAddr[2] = (CARD_CFG_ETH_IP>>8)&0xff;
myIpAddr[3] = (CARD_CFG_ETH_IP>>0)&0xff;
myGwIpAddr[0] = (CARD_CFG_ETH_GATE>>24)&0xff;
myGwIpAddr[1] = (CARD_CFG_ETH_GATE>>16)&0xff;
myGwIpAddr[2] = (CARD_CFG_ETH_GATE>>8)&0xff;
myGwIpAddr[3] = (CARD_CFG_ETH_GATE>>0)&0xff;
myGwIpMask[0] = (CARD_CFG_ETH_MASK>>24)&0xff;
myGwIpMask[1] = (CARD_CFG_ETH_MASK>>16)&0xff;
myGwIpMask[2] = (CARD_CFG_ETH_MASK>>8)&0xff;
myGwIpMask[3] = (CARD_CFG_ETH_MASK>>0)&0xff;
GetMacAddr(MACAddr);
GetMacAddr(CARD_CFG_ETH_MAC);
//ShowDataHex((u8 *)&myIpAddr, 4);
iret = CH57xNET_LibInit((u8 *)myIpAddr,(u8 *)&myGwIpAddr,(u8 *)&myGwIpMask,CARD_CFG_ETH_MAC);
mStopIfError(iret);
NVIC_EnableIRQ(ETH_IRQn);
iret = 0;
while ( CH57xInf.PHYStat < 2 )
{
DelayMs(50);
iret++;
if(iret > 200) //等待10秒钟超时
{
break;
}
}
//同时创建TCP服务器和UDP服务器时,UDP接收发送1次后,再也无法接收数据???????
//创建工作端口TCP SOCKET
//CH57xNET_CreatTcpSocket();
//创建 30000 固定端口TCP SOCKET
//CH57xNET_CreatTcpSocket3W();
//创建UDP socket
CH57xNET_CreatUdpSocket();
}