WCH沁恒单片机
直播中

贾飞小

7年用户 1748经验值
私信 关注
[问答]

CH579的网络协议栈不能同时支持TCP和UDP服务器吗?

使用 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:%drn", 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:%xrn", CARD_CFG_ETH_IP);

//printf("MASK:%xrn", 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();



}



回帖(2)

仲娜娜

2022-8-19 09:38:48
您好,CH579是可以实现同时跑TCP与UDP的。如果您UDP发送一次就无法通讯,您可以看看CH579是不是报了Time out中断。然后您也可以同步打开wireshark,抓包看看,tcp有没有三次握手。或者断开
举报

于帅

2022-8-19 09:39:39
您好,您这个UDP是广播发送,您看一下是不是进入了CH57xNET_UdpServerRecv函数,UDP广播的接收是进入到哦这个接收函数处理的。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分