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:%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();


}


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


抓包结果如下,同时打开UDP和TCP服务器后,发送UDP包第一个数据包正常,后续说找不到目的地址了,不知道什么原因,

如果我只打开UDP服务器,那都正常

image.png



同时打开UDP和TCP服务器后,UDP通信抓包结果如下,第一次通信成功后,后续就找不到目的地了,好奇怪。

image.png


调试中发现当同时打开TCP和UDP服务器时,第2次发UDP报文时, CH579端程序都不进 UDP接收回调函数CH57xNET_UdpServerRecv  


您好,您这个UDP是广播发送,您看一下是不是进入了CH57xNET_UdpServerRecv函数,UDP广播的接收是进入到哦这个接收函数处理的。


我是通过PC机网络调试助手向CH579固定IP地址固定端口发送数据的, 创建了TCP监听SOCKET后,第1次通过网络调试助手以UDP协议给CH579发送数据时,CH57xNET_UdpServerRecv 能收到数据,并且也能发送给PC机网络调试助手。 我再次通过PC机网络调试助手给 CH579 发送数据时,没有进入到 CH57xNET_UdpServerRecv  函数


如果我不创建TCP 监听SOCKET,就一切正常,就是感觉 TCP SOCKET和 UDP 不能同时使用一样。

你们可以写个demo测试一下看看


只有登录才能回复,可以选择微信账号登录