尊敬的 TI 支持人员:
我使用双板 CC3220来传输数据(LAN 网络)、
A 侧:向 B 侧发送数据并等待响应数据包:源端口 X -> dst 端口5004
B 侧:侦听端口5004并将响应数据包发送到端口 X 中的 A
我的问题:
B 侧侦听端口5004并从 A 侧接收数据包、然后在端口 X 中接收响应
A 侧不知道要侦听的端口 X。
如何将端口 X 固定在 A 侧?
我可以接收来自 A 侧任何端口的数据包吗?
非常感谢、
VU。
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.
尊敬的 TI 支持人员:
我使用双板 CC3220来传输数据(LAN 网络)、
A 侧:向 B 侧发送数据并等待响应数据包:源端口 X -> dst 端口5004
B 侧:侦听端口5004并将响应数据包发送到端口 X 中的 A
我的问题:
B 侧侦听端口5004并从 A 侧接收数据包、然后在端口 X 中接收响应
A 侧不知道要侦听的端口 X。
如何将端口 X 固定在 A 侧?
我可以接收来自 A 侧任何端口的数据包吗?
非常感谢、
VU。
您好、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、
您好、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月