CH32V307,DHCP模式下,創(chuàng)建UDPserver,報錯。

如題,要創(chuàng)建一個UDP server,在系統(tǒng)初始化時先進行網(wǎng)絡(luò)初始化,兩種方式,一種是靜態(tài)IP,一種是動態(tài)IP。


靜態(tài)IP時,在主函數(shù)中直接調(diào)用WCHNET_CreateUdpSocket創(chuàng)建UDP服務(wù),能夠成功;

動態(tài)IP時,在回調(diào)WCHNET_DHCPCallBack中創(chuàng)建UDP服務(wù),報錯 0x11 (WCHNET_ERR_MEM)


在上述兩個位置創(chuàng)建tcpClient,均能成功。


代碼如下,main函數(shù)在例程的基礎(chǔ)上加了一個靜態(tài)/動態(tài)IP的分支選擇。

修改帖子,代碼顯示有問題,?3樓重貼代碼。


WCHNET_CreateUdpSocket 用的是例程中的代碼,不知是否要補充參數(shù)。


/*********************************************************************
?*?@fn??????WCHNET_CreateUdpSocket
?*
?*?@brief???Create?UDP?Socket
?*
?*?@return??none
?*/
void?WCHNET_CreateUdpSocket(void)
{
????u8?i;
????SOCK_INF?TmpSocketInf;
????memset((void?*)?&TmpSocketInf,?0,?sizeof(SOCK_INF));
????TmpSocketInf.SourPort?=?udpServerPort;
????TmpSocketInf.ProtoType?=?PROTO_TYPE_UDP;
????TmpSocketInf.RecvStartPoint?=?(u32)?SocketRecvBuf;
????TmpSocketInf.RecvBufLen?=?UDP_RECE_BUF_LEN;
????TmpSocketInf.AppCallBack?=?WCHNET_UdpServerRecv;
????i?=?WCHNET_SocketCreat(&UDPSocketId,?&TmpSocketInf);
????printf("UDP:WCHNET_SocketCreat?%d\r\n",?UDPSocketId);
????mStopIfError(i);
}



void?main(){
??????......
????????????????
????WCHNET_DHCPSetHostname("WCHNET");?????????????//Configure?DHCP?host?name
????i?=?ETH_LibInit(IPAddr,GWIPAddr,IPMask,MACAddr);???//Ethernet?library?initialize
????mStopIfError(i);
????if(i?==?WCHNET_ERR_SUCCESS)
????????printf("WCHNET_LibInit?Success\r\n");
????????
????if(IPAddr[0]){
????????//?靜態(tài)ip地址
????????//?創(chuàng)建udp服務(wù),?這里創(chuàng)建UDP服務(wù)能夠成功。在這里創(chuàng)建TCPClient也能成功
????????WCHNET_CreateUdpSocket();???
????}else?{
????????//Start?DHCP?動態(tài)IP
????????WCHNET_DHCPStart(WCHNET_DHCPCallBack);
????}
????
????....
}
u8?WCHNET_DHCPCallBack(u8?status,?void?*arg)
{
????u8?*p;
????u8?tmp[4]?=?{0,?0,?0,?0};
????if(!status)
????{
????????p?=?arg;
????????printf("DHCP?Success\r\n");
????????/*If?the?obtained?IP?is?the?same?as?the?last?IP,?exit?this?function.*/
????????if(!memcmp(IPAddr,?p?,sizeof(IPAddr)))
????????????return?READY;
????????/*Determine?whether?it?is?the?first?successful?IP?acquisition*/
????????if(memcmp(IPAddr,?tmp?,sizeof(IPAddr))){
????????????/*The?obtained?IP?is?different?from?the?last?value,
?????????????*?then?disconnect?the?last?connection.*/
????????????WCHNET_SocketClose(SocketId,?TCP_CLOSE_NORMAL);
????????}
????????memcpy(IPAddr,?p,?4);
????????memcpy(GWIPAddr,?&p[4],?4);
????????memcpy(IPMask,?&p[8],?4);
????????printf("IPAddr?=?%d.%d.%d.%d?\r\n",?(u16)IPAddr[0],?(u16)IPAddr[1],
???????????????(u16)IPAddr[2],?(u16)IPAddr[3]);
????????printf("GWIPAddr?=?%d.%d.%d.%d?\r\n",?(u16)GWIPAddr[0],?(u16)GWIPAddr[1],
???????????????(u16)GWIPAddr[2],?(u16)GWIPAddr[3]);
????????printf("IPMask?=?%d.%d.%d.%d?\r\n",?(u16)IPMask[0],?(u16)IPMask[1],
???????????????(u16)IPMask[2],?(u16)IPMask[3]);
????????printf("DNS1:?%d.%d.%d.%d?\r\n",?p[12],?p[13],?p[14],?p[15]);
????????printf("DNS2:?%d.%d.%d.%d?\r\n",?p[16],?p[17],?p[18],?p[19]);
????????
????????//創(chuàng)建udp服務(wù)
????????//??這里創(chuàng)建UDP服務(wù)報錯0x11。WCHNET_ERR_MEM,?out?of?memory?error.?
????????//??在這里創(chuàng)建TCPClient能成功
????????WCHNET_CreateUdpSocket();??
????????
????????return?READY;
????}
????else
????{
????????printf("DHCP?Fail?%02x?\r\n",?status);
????????/*Determine?whether?it?is?the?first?successful?IP?acquisition*/
????????if(memcmp(IPAddr,?tmp?,sizeof(IPAddr))){
????????????/*The?obtained?IP?is?different?from?the?last?value*/
????????????WCHNET_SocketClose(SocketId,?TCP_CLOSE_NORMAL);
????????}
????????return?NoREADY;
????}
}




您好,我這邊通過分配動態(tài)ip創(chuàng)建UDP是正常的,附上測試程序,您可以測試一下,看您的報錯,是內(nèi)存溢出,可能是創(chuàng)建的socket數(shù)量超出定義導致,您可以將您的工程發(fā)我郵箱,我?guī)湍聪?,后續(xù)有問題可通過郵箱聯(lián)系:kx@wch.cn

image.png

icon_rar.gifDHCP-UDP.zip



收到,多謝。我先測試一下。


@TECH_Kx

您發(fā)過來的例子,已跑通,能夠建立起udp服務(wù),但具體的應(yīng)用還有幾個問題需再確認一下:


1、您給的例子中,在創(chuàng)建UDPServer時就指定了客戶端IP地址與端口,只有指定的客戶端(包括IP和端口)發(fā)服務(wù)器發(fā)送數(shù)據(jù)才有應(yīng)答。這種方式滿足不了實際需求;


2、系統(tǒng)提供的UDPServer例子中(net version:16),用到了回調(diào)函數(shù),?TmpSocketInf.AppCallBack = WCHNET_UdpServerRecv,可以接收任意客戶端發(fā)過來的數(shù)據(jù)并響應(yīng);? 您給的例子中(net version:17),對數(shù)據(jù)的處理是在WCHNET_DataLoopback中實現(xiàn)的,但我沒version17實現(xiàn)這種回調(diào)。?


下面的代碼,是我在您基礎(chǔ)上增加了一個函數(shù)、一條語句,沒跑通。

//?這個函數(shù)是從系統(tǒng)Exam的UDPServer中復制過來的?(net?version:?16)
void?WCHNET_UdpServerRecv(struct?_SCOK_INF?*socinf,?u32?ipaddr,?u16?port,?u8?*buf,?u32?len)
{
????u8?ip_addr[4],?i;
????printf("Remote?IP:");
????for?(i?=?0;?i?<?4;?i++)?{
????????ip_addr[i]?=?ipaddr?&?0xff;
????????printf("%d?",?ip_addr[i]);
????????ipaddr?=?ipaddr?>>?8;
????}
????printf("srcport?=?%d?len?=?%d?socketid?=?%d\r\n",?port,?len,
????????????socinf->SockIndex);
????WCHNET_SocketUdpSendTo(socinf->SockIndex,?buf,?&len,?ip_addr,?port);
}

/*********************************************************************
?*?@fn??????WCHNET_CreateUdpSocket
?*
?*?@brief???Create?UDP?Socket
?*
?*?@return??none
?*/
void?WCHNET_CreateUdpSocket(void)
{
????u8?i;
????SOCK_INF?TmpSocketInf;
????memset((void?*)?&TmpSocketInf,?0,?sizeof(SOCK_INF));?//?作為服務(wù)端,應(yīng)該是不需要指定客戶端ip、port的
????memcpy((void?*)?TmpSocketInf.IPAddr,?DESIP,?4);??????//?但不指定desip/desport,會輸出“TCP?Disconnect”
????TmpSocketInf.DesPort?=?desport;??????????????????????//???且客戶端發(fā)送數(shù)據(jù)過來,會輸出“HardFault_Handler”(僅一次)?
????TmpSocketInf.SourPort?=?srcport;
????TmpSocketInf.ProtoType?=?PROTO_TYPE_UDP;
????TmpSocketInf.RecvStartPoint?=?(u32)?SocketRecvBuf[SocketId];
????TmpSocketInf.RecvBufLen?=?UDP_RECE_BUF_LEN;
????TmpSocketInf.AppCallBack?=?WCHNET_UdpServerRecv;?//?加了這一句,用于回調(diào),沒有成功
????i?=?WCHNET_SocketCreat(&SocketId,?&TmpSocketInf);
????printf("WCHNET_SocketCreat?%d\r\n",?SocketId);
????mStopIfError(i);
}



icon_rar.gifEXAM-DHCP-UDPServer.zip


報錯源碼。


問題解決,感謝!


ETH例程每創(chuàng)建一個TCP或者UDP的時候是需要在netconfig.h中增加響應(yīng)的數(shù)量,如上圖,因為DHCP本身是采用的UDP協(xié)議,所以DHCP例程中WCHNET_NUM_UDP的數(shù)量為1,這就是為什么當您關(guān)閉DHCP的時候,創(chuàng)建UDP是可以的,當您開啟DHCP的時候,由于DHCP已經(jīng)占用這個UDPsocket,所以您再創(chuàng)建UDP就會顯示溢出緩沖區(qū)的錯誤(緩沖區(qū)是依據(jù)socket的數(shù)量來創(chuàng)建的),如果您想在開啟DHCP的情況下創(chuàng)建UDP則需要將WCHNET_NUM_UDP的數(shù)量改為2,如果您想創(chuàng)建兩個UDP,則改完3,意思就是每多創(chuàng)建一個就要增加一個數(shù)量,創(chuàng)建TCP也是如此,


只有登錄才能回復,可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频