使用MFC编写的上位机利用以太网接收UDP报文,为什么不能读取缓冲区中数据?

2019-03-24 12:26发布

本人使用LM3S8962编写了使用以太网发送UDP报文的程序。可以正确接收来自上位机的UDP报文,也可以发送UDP报文。使用LM3S8962发出的报文,能够在上位机上被捕包软件iptool成功捕获,从数据上看,是正确的(看图)。但是使用MFC编写的UDP接收程序却接收不到,使用ezUDP也接收不到。请问这是哪里出了问题?


08f790529822720e8bef60b27acb0a46f21fab51.jpg
ae51f3deb48f8c544f4b47673b292df5e1fe7fda.jpg 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
huangzhechen
1楼-- · 2019-03-24 18:06
< 帖一下代码:IP层
unsigned char
IPv4DatagramSend(unsigned char* pucDestIP,
                                unsigned char        ucUpperProtocol,
                                 unsigned short usDatagramLen)
{
        ARPTableEntry* DestAddrPTR;
        EthFrameHead*        EthSendFrameHeadPTR;
        /*Search the ARP Table for the MAC address*/
        DestAddrPTR=pucARPEntry(pucDestIP);
       
        if (DestAddrPTR==NULL)
        {
                /* If no IP address is found, send a ARP request and return 0*/
                ARPPacketOut(pucDestIP,
                                                                 pucBroadcastMACAddr,
                                                                 ARP_REQUEST);
                               
                return 0;
        }
        else/* Find the IP address in the ARP Table and send the datagram*/
        {
        /* Ethernet Frame Header Set*/
                EthSendFrameHeadPTR=(EthFrameHead *)(&(pucSendBuffer[0]));
                memcpy(EthSendFrameHeadPTR->pucDestMACAddr,
                                        DestAddrPTR->pucMACAddr,6);
                /* Source MAC is in the Frame.*/
               
                /* Upper protocol is IPv4 protocol*/
                EthSendFrameHeadPTR->usUpperProtocol=RFC894_IPv4;
               
                /* IP Datagram header Set*/
                /* 1 version and header length*/
                SENDIPv4HeaderPTR->ucVerHL=IPv4_nOP;
               
                /* 2 Type of Service */
                SENDIPv4HeaderPTR->ucTOS=DEFAULT_TOS_SETTING;
               
                /* Datagram Length (IPv4 datagram Header included)*/
                if (usDatagramLen+IPV4_HEADER_LEN<46)
                {
                        usDatagramLen=46-IPV4_HEADER_LEN;
                }
#ifdef Little_Endian               
                SENDIPv4HeaderPTR->usDataLen=usDatagramLen+IPV4_HEADER_LEN;
#endif
#ifdef Big_Endian
                SENDIPv4HeaderPTR->usDataLen=ByteReverseShort(usDatagramLen+IPV4_HEADER_LEN);
#endif
                // Identification
                usIPID++;
                SENDIPv4HeaderPTR->usId=usIPID;
               
                /* Flag Fragment offset
                 fragment when necessary
                 Fragment offset is zero*/
                SENDIPv4HeaderPTR->usFlagFragment=0x00;
               
                /* TTL hops=128 in this system */
                SENDIPv4HeaderPTR->ucTTL=128;
               
                /* Upper Protocol*/
                SENDIPv4HeaderPTR->ucUpperProtocol=ucUpperProtocol;
               
                /* Source IP address set:pucSourceIPAddr*/
                memcpy(SENDIPv4HeaderPTR->pucSourceIPAddr,pucHostIPAddr,4);
               
                /* Destination IP address set:pucDestIPAddr*/
                memcpy(SENDIPv4HeaderPTR->pucDestIPAddr,pucDestIP,4);
               
                /* Header checksum*/
                IPv4HeaderChecksumWrite(SENDIPv4HeaderPTR);
               
                /* Compute the length of the data to be transmitted*/
                ulTxLen=(unsigned long)usDatagramLen
                                                +(unsigned long)IPV4_HEADER_LEN
                                                +(unsigned long)ETH_HEADER_LEN;
                EthernetPacketPut(ETH_BASE,pucSendBuffer,(long)ulTxLen);
                ulTxLen=0;
                return 1;                                                                                                                                       
        }
}
huangzhechen
2楼-- · 2019-03-24 20:53
 精彩回答 2  元偷偷看……
Study_Stellaris
3楼-- · 2019-03-24 21:21
抓包软件能看到数据,说明下位机没问题.
应该是 MFC Winsock 的问题吧.
对上位机多做几次测试看看.
后续上位机,我打算用 QT .

一周热门 更多>

相关问题

    相关文章