This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC3220MODA:从任何端口接收 UDP 数据包。

Guru**** 2381530 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1008090/cc3220moda-receive-udp-packet-from-any-port

器件型号:CC3220MODA

尊敬的 TI 支持人员:

我使用双板 CC3220来传输数据(LAN 网络)、

A 侧:向 B 侧发送数据并等待响应数据包:源端口 X -> dst 端口5004

B 侧:侦听端口5004并将响应数据包发送到端口 X 中的 A

我的问题:

B 侧侦听端口5004并从 A 侧接收数据包、然后在端口 X 中接收响应

A 侧不知道要侦听的端口 X。

如何将端口 X 固定在 A 侧?

我可以接收来自 A 侧任何端口的数据包吗?

非常感谢、

VU。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Vu,

    从技术上讲、可能可以通过旁路网络堆栈从所有 UDP 端口接收数据包、但这种方法并不实用。

    常见的做法是在 A 侧的源端口 X 上"侦听"。因此、B 侧知道确切的端口以进行响应。

    1月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Jan、

    我无法确定 A 侧的源端口 X、  

    我使用 Wireshark 捕获数据包、A 侧的源端口是随机的。 当端口 X 中的 B 响应时、我不知道在 A 侧侦听哪个端口、

    感谢您的回复、

    VU

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     您好 Vu,

    您可以在 A 侧设置 UDP 端口。此示例演示了 BSD 套接字的客户端和服务器端。

    1月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Jan、

     这是我的代码

    	ip_call = 0xc0a8010f;
    	call_port = 5004;
        calling_to(ip_call, call_port, 1);
    
    // Send data in app_CB.gDataBuffer.nwData to ip at portnumber with quantity is numPack
    void calling_to(uint32_t ip, uint16_t portNumber, uint32_t numPack){
        //unsigned short i;
    
        SendCmd_t SendCmdParams;
        SendCmdParams.nb = 1;
        SendCmdParams.portNumber = portNumber;
        SendCmdParams.ipv6 = 0;
        SendCmdParams.numberOfPackets = numPack;
    
        SendCmdParams.ipAddr.ipv4 = ip;
    	
    	app_CB.gDataBuffer.nwData[0] = 0x00;
    	app_CB.gDataBuffer.nwData[1] = 0x01;
    	app_CB.gDataBuffer.nwData[2] = 0x00;
    	app_CB.gDataBuffer.nwData[3] = 0x00;
    	app_CB.gDataBuffer.nwData[4] = 0x21;
    	app_CB.gDataBuffer.nwData[5] = 0x12;
    	app_CB.gDataBuffer.nwData[6] = 0xa4;
    	app_CB.gDataBuffer.nwData[7] = 0x42;
    	app_CB.gDataBuffer.nwData[8] = 0x6f;
    	app_CB.gDataBuffer.nwData[9] = 0x70;
    	app_CB.gDataBuffer.nwData[10] = 0x38;
    	app_CB.gDataBuffer.nwData[11] = 0x67;
    	app_CB.gDataBuffer.nwData[12] = 0x77;
    	app_CB.gDataBuffer.nwData[13] = 0x77;
    	app_CB.gDataBuffer.nwData[14] = 0x2f;
    	app_CB.gDataBuffer.nwData[15] = 0x36;
    	app_CB.gDataBuffer.nwData[16] = 0x53;
    	app_CB.gDataBuffer.nwData[17] = 0x2b;
    	app_CB.gDataBuffer.nwData[18] = 0x63;
    	app_CB.gDataBuffer.nwData[19] = 0x68;
    	
        UDPClient3(20, SendCmdParams.nb, SendCmdParams.portNumber,SendCmdParams.ipAddr, SendCmdParams.ipv6,
                                      SendCmdParams.numberOfPackets, TRUE);
    }
    
    // Send data UDP
    int32_t UDPClient3(int32_t buflen, uint8_t nb, uint16_t portNumber, ip_t ipAddress, uint8_t ipv6, uint32_t numberOfPackets, uint8_t tx)
    {
        int32_t sock;
        int32_t status;
        uint32_t i = 0;
        int32_t nonBlocking;
        //int32_t buflen;
        SlSockAddr_t        *sa;
        int32_t addrSize;
        sockAddr_t sAddr;
        uint16_t nb_counter = 0;
        struct SlTimeval_t TimeVal;
    
        /* clear the global data buffer */
        //memset(app_CB.gDataBuffer.nwData, 0x0, MAX_BUF_SIZE);
    
        //buflen = MAX_BUF_SIZE;
    
    	sAddr.in4.sin_family = SL_AF_INET;
    	sAddr.in4.sin_port = sl_Htons((unsigned short)portNumber);
    	sAddr.in4.sin_addr.s_addr = sl_Htonl((unsigned int)ipAddress.ipv4);
    
    	sa = (SlSockAddr_t*)&sAddr.in4;
    	addrSize = sizeof(SlSockAddrIn_t);
    
        /* Get UDP sock descriptor - This call opens the socket. */
        sock = sl_Socket(sa->sa_family,SL_SOCK_DGRAM, 0);
    	status = sl_Bind(sock, sa, addrSize);
    #if 1
        _u32 rate = 0xFF; // see wlan.h SlWlanRateIndex_e for values
        sl_SetSockOpt(sock, SL_SOL_PHY_OPT, SL_SO_PHY_RATE, &rate, sizeof(rate));
    
        _u32 txpower = 0; // valid range is 1-15
        sl_SetSockOpt(sock, SL_SOL_PHY_OPT, SL_SO_PHY_TX_POWER, &txpower, sizeof(txpower));
    
        _u32 numframes = 1;
        sl_SetSockOpt(sock, SL_SOL_PHY_OPT, SL_SO_PHY_NUM_FRAMES_TO_TX, &numframes, sizeof(numframes));
    #endif
    
    	nonBlocking = TRUE;
    	status =
    		sl_SetSockOpt(sock, SL_SOL_SOCKET, SL_SO_NONBLOCKING, &nonBlocking,
    					  sizeof(nonBlocking));
    	if(status < 0)
    	{
    		sl_Close(sock);
    		return(-1);
    	}
        i = 0;
    
    	while(i < numberOfPackets)
    	{
    		/* Send packets to server */
    		status = sl_SendTo(sock, &app_CB.gDataBuffer.nwData, buflen, 0, sa, (SlSocklen_t)addrSize);						  
    		usleep(5);
    		if((status == SL_ERROR_BSD_EAGAIN) && (TRUE == nb))
    		{
    			usleep(10);
    			continue;
    		}
    		else if(status < 0)
    		{
    			sl_Close(sock);
    			return(-1);
    		}
    		i++;
    	}
        status = sl_Close(sock);
        return(0);
    }

    我尝试像您的示例一样进行设置,在 UDPClient 中,sento ()的参数是目的端口,而不是源端口。

    发送 UDP 封包时、我无法固定源端口。

    谢谢、

    VU、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Vu,

    您的 UDP 客户端代码不正确。 不应对 BSD 客户端使用 BIND。 绑定用于 UDP 服务器。 代码内部缺少 Recvfrom (),而套接字选项代码 sl_SO_PHY_与 UDP 套接字无关。

    我很困惑我到底想实现什么。 上面的示例准确地演示了 BSD 如何搜索 UDP 服务器和客户端。

    1月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Jan、  

    在我的项目中、发送和接收是分开的。

    有时我希望 cc3220发送数据包 UDP,因此我使用 sendto (),而不是等待响应。

    VU、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    在这种情况下、上面示例中的代码应该可以正常工作(使用单个 UDP 客户端套接字进行发送和接收)。 但是、如果您想使用多个套接字、则没有什么会阻止您在两端运行 UDP 服务器。 在这种情况下,您将使用固定端口绑定套接字(与任何服务器套接字一样)。

    1月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Jan、  

    这是新代码

    	int32_t AddrSize;
    	_i16 Sd;
    	_i16 Status;
    	SlSockAddrIn_t Addr;
    	_i8 SendBuf[] = "Hello World !!!";
    	_i8 RecvBuf[1460];
    	Sd = sl_Socket(SL_AF_INET, SL_SOCK_DGRAM, 0);
    	if( 0 > Sd )
    	{
    	 // error
    	}
    		
    	nonBlocking = TRUE;
    	Status = sl_SetSockOpt(Sd, SL_SOL_SOCKET, SL_SO_NONBLOCKING, &nonBlocking, sizeof(nonBlocking));
    	if(Status < 0)
    	{
    		sl_Close(Sd);
    		return(-1);
    	}
    	
    	Addr.sin_family = SL_AF_INET;
    	Addr.sin_port = sl_Htons(5004);
    	Addr.sin_addr.s_addr = SL_INADDR_ANY;
    	Status = sl_Bind(Sd, ( SlSockAddr_t *)&Addr, sizeof(SlSockAddrIn_t));
    	if( Status )
    	{
    	// error
    	}
    	Addr.sin_family = SL_AF_INET;
    	Addr.sin_port = sl_Htons(5001);
    	Addr.sin_addr.s_addr = sl_Htonl(SL_IPV4_VAL(192,168,1,15));
    	Status = sl_SendTo(Sd, SendBuf, strlen(SendBuf), 0, (SlSockAddr_t*)&Addr,sizeof(SlSockAddr_t));
    	if( strlen(SendBuf) != Status )
    	{
    	 // error
    	}
    	AddrSize = sizeof(SlSockAddrIn_t);
    	Status = sl_RecvFrom(Sd, RecvBuf, 1460, 0, ( SlSockAddr_t *)&Addr, &AddrSize);
    	if( 0 > Status )
    	{
    	 // error
    	}
    	Status = sl_Close(Sd);
    	if( Status )
    	{
    	 // error
    	}

    当我绑定端口5004并发送->路由器分配源端口是随机的、

    如果端口为't 5004、则源端口为固定端口。

    我不知道路由器如何为 cc3220分配端口。

    我将尝试使用另一个端口、

    谢谢、

    VU、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Vu,

    很抱歉、我不明白您要说什么。 最后一个注释。

    但根据您上次的评论、您似乎希望在子网之间发送数据包。 对吧? 您应在您的第一个帖子中提供此信息。 如果中间人(路由器/NAT/防火墙)因路由原因而更改数据包内的端口、CC3220将无法执行此操作。 在之间路由 UDP 数据包总是有问题的、最好避免这些问题。 因为正确的功能取决于使用的网络硬件和正确的路由器/NAT/防火墙配置。 在这种用例中、TCP 问题更少。

    但是,如果使用正确的路由器/NAT/防火墙设置,您应该能够通过“标准”UDP 客户端/服务器代码在子网之间正确发送数据包。

    1月