CH579 TCP,UDP服務(wù)器網(wǎng)絡(luò)通信問題

使用?CH579單獨(dú)實(shí)現(xiàn)TCP服務(wù)器通信? 或 UDP服務(wù)器通信都正常

在CH579上同時(shí)使用TCP服務(wù)器和UDP服務(wù)器的時(shí)候,TCP服務(wù)器能正常工作,UDP服務(wù)器收發(fā)成功1次后,就再也無法通信了? CH579的網(wǎng)絡(luò)協(xié)議棧不能同時(shí)支持 TCP和UDP服務(wù)器嗎?


void CH57xNET_CreatTcpSocket(void)

{

? ?UINT8 i;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ?SOCK_INF TmpSocketInf;? ?

? ?/* 創(chuàng)建臨時(shí)socket變量 */


? ?printf("Tcp port:%d\r\n", CARD_CFG_TCP_PORT);


? ?memset((void *)&TmpSocketInf,0,sizeof(SOCK_INF));? ? ? ? ? ? ? ? ? ? ? ? ? ? /* 庫內(nèi)部會(huì)將此變量復(fù)制,所以最好將臨時(shí)變量先全部清零 */

? ?TmpSocketInf.SourPort = CARD_CFG_TCP_PORT;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 設(shè)置源端口 */

? ?TmpSocketInf.ProtoType = PROTO_TYPE_TCP;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 設(shè)置socekt類型 */

? ?TmpSocketInf.RecvStartPoint = (UINT32)SocketRecvBuf;? ? ? ? ? ? ? ? ? ? ? ? ?/* 設(shè)置接收緩沖區(qū)的接收緩沖區(qū) */

? ?TmpSocketInf.RecvBufLen = RECE_BUF_LEN ;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 設(shè)置接收緩沖區(qū)的接收長度 */

? ?i = CH57xNET_SocketCreat(&gSerSocketId,&TmpSocketInf);? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 創(chuàng)建socket,將返回的socket索引保存在SocketId中 */

? ?mStopIfError(i);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 檢查錯(cuò)誤 */


#ifdef? KEEPLIVE_ENABLE

? ?CH57xNET_SocketSetKeepLive(gSerSocketId, 1 );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 開啟socket的KEEPLIVE功能(V06版本支持) */

#endif


? ?i = CH57xNET_SocketListen(gSerSocketId);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* TCP連接 */

? ?mStopIfError(i);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 檢查錯(cuò)誤 */

? ?i = CH57xNET_SetSocketTTL(gSerSocketId,128 );

? ?mStopIfError(i);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 檢查錯(cuò)誤 */

}


void CH57xNET_CreatUdpSocket(void)

{

? ?UINT8 i;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ?SOCK_INF TmpSocketInf;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 創(chuàng)建臨時(shí)socket變量 */

? ?

? ?//創(chuàng)建UDP socket目的IP和端口號任意設(shè)定

? ?UINT8 DESIP[4]? ?= {255,255,255,255};??

? ?memset((void *)&TmpSocketInf,0,sizeof(SOCK_INF));? ? ? ? ? ? ? ? ? ? ? ? ? ? /* 庫內(nèi)部會(huì)將此變量復(fù)制,所以最好將臨時(shí)變量先全部清零 */

? ?memcpy((void *)TmpSocketInf.IPAddr,DESIP,4);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 設(shè)置目的IP地址 */

? ?TmpSocketInf.DesPort = 2000;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 設(shè)置目的端口 */

? ?TmpSocketInf.SourPort = UDP_LOCAL_DEFAULT_PORT;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* 設(shè)置源端口 */

? ?TmpSocketInf.ProtoType = PROTO_TYPE_UDP;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 設(shè)置socekt類型 */

? ?TmpSocketInf.AppCallBack = CH57xNET_UdpServerRecv;? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 接收回調(diào)函數(shù) */

? ?TmpSocketInf.RecvStartPoint = (UINT32)SocketRecvBuf[0];? ? ? ? ? ? ? ? ? ? ? ? ?/* 設(shè)置接收緩沖區(qū)的接收緩沖區(qū) */

? ?TmpSocketInf.RecvBufLen = RECE_BUF_LEN ;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 設(shè)置接收緩沖區(qū)的接收長度 */

? ?i = CH57xNET_SocketCreat(&gUdpSocketId,&TmpSocketInf);? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 創(chuàng)建socket,將返回的socket索引保存在SocketId中 */

? ?mStopIfError(i);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 檢查錯(cuò)誤 */

}



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秒鐘超時(shí)

{

break;

}

}



? ? ? //同時(shí)創(chuàng)建TCP服務(wù)器和UDP服務(wù)器時(shí),UDP接收發(fā)送1次后,再也無法接收數(shù)據(jù)???????

//創(chuàng)建工作端口TCP SOCKET

? ? ? ?//CH57xNET_CreatTcpSocket();??


//創(chuàng)建 30000 固定端口TCP SOCKET

//CH57xNET_CreatTcpSocket3W();


//創(chuàng)建UDP socket

CH57xNET_CreatUdpSocket();


}


您好,CH579是可以實(shí)現(xiàn)同時(shí)跑TCP與UDP的。如果您UDP發(fā)送一次就無法通訊,您可以看看CH579是不是報(bào)了Time out中斷。然后您也可以同步打開wireshark,抓包看看,tcp有沒有三次握手?;蛘邤嚅_


抓包結(jié)果如下,同時(shí)打開UDP和TCP服務(wù)器后,發(fā)送UDP包第一個(gè)數(shù)據(jù)包正常,后續(xù)說找不到目的地址了,不知道什么原因,

如果我只打開UDP服務(wù)器,那都正常

image.png



同時(shí)打開UDP和TCP服務(wù)器后,UDP通信抓包結(jié)果如下,第一次通信成功后,后續(xù)就找不到目的地了,好奇怪。

image.png


調(diào)試中發(fā)現(xiàn)當(dāng)同時(shí)打開TCP和UDP服務(wù)器時(shí),第2次發(fā)UDP報(bào)文時(shí), CH579端程序都不進(jìn) UDP接收回調(diào)函數(shù)CH57xNET_UdpServerRecv??


您好,您這個(gè)UDP是廣播發(fā)送,您看一下是不是進(jìn)入了CH57xNET_UdpServerRecv函數(shù),UDP廣播的接收是進(jìn)入到哦這個(gè)接收函數(shù)處理的。


我是通過PC機(jī)網(wǎng)絡(luò)調(diào)試助手向CH579固定IP地址固定端口發(fā)送數(shù)據(jù)的, 創(chuàng)建了TCP監(jiān)聽SOCKET后,第1次通過網(wǎng)絡(luò)調(diào)試助手以UDP協(xié)議給CH579發(fā)送數(shù)據(jù)時(shí),CH57xNET_UdpServerRecv 能收到數(shù)據(jù),并且也能發(fā)送給PC機(jī)網(wǎng)絡(luò)調(diào)試助手。 我再次通過PC機(jī)網(wǎng)絡(luò)調(diào)試助手給?CH579 發(fā)送數(shù)據(jù)時(shí),沒有進(jìn)入到?CH57xNET_UdpServerRecv? 函數(shù)


如果我不創(chuàng)建TCP 監(jiān)聽SOCKET,就一切正常,就是感覺 TCP SOCKET和 UDP 不能同時(shí)使用一樣。

你們可以寫個(gè)demo測試一下看看


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

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