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.

[参考译文] CCS/MSP432E411Y-BGAEVM:MSP432E4 NDK UDP 绑定错误。 不能同时拥有2台 UDP 服务器

Guru**** 2587345 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/889920/ccs-msp432e411y-bgaevm-msp432e4-ndk-udp-bind-error-cannot-have-2-udp-servers-at-the-same-time

器件型号:MSP432E411Y-BGAEVM

工具/软件:Code Composer Studio

我已经运行 UDP 服务器几个月了、没有任何问题。 现在、我需要在另一个端口上添加另一个端口、它会返回第二个服务器的绑定函数上的错误。 如果我一次只运行一台服务器、则效果不错、但同时不能运行。  

我可以打开的 UDP 套接字数量是否有限制? 或者对我可以运行的 UDP 服务器有任何限制?

void * UDPFinder 任务(void * arg0)
{
内部 字节接收;
内部 字节 Sent;
内部 状态;
内部 服务器;
int n;
FD_SET readSet;
struct sockaddr_in localAddr;
struct sockaddr_in clientAddr;
socklen_t 地址;
特性 缓冲器[UDPPACKETSIZE];
uint16_t 端口号=*(uint16_t *) arg0;
uint32_t iptmp;
字符响应[64];

volatile tEEPROM_Data * pManufacturerInformation;

fdOpenSession (TaskSelf());

Display_printf (g_SMCDisplay、0、0、"UDP 服务器在端口(%d)上启动\n"、portNumber);

服务器=套接字(AF_iNet、SOCK_DGRAM、0);
if (server ==1){
Display_printf (g_SMCDisplay、0、0、"错误:未创建套接字。\n");
转到关断;
}

memset (localAddr、0、sizeof (localAddr));
localAddr.Sin_Family = AF_iNet;
localAddr.sin_addr.s_addr = htonl (INADDR_ANY);
localAddr.sin 端口= htons (portNumber);

status = bind (server、(struct sockaddr *)&localAddr、sizeof (localAddr));
如果(status =-1){
Display_printf (g_SMCDisplay、0、0、"错误:绑定失败。\n");
转到关断;
}

执行{
/*
* readSet 和 addrlen 是值结果参数、必须重置
*在每个 select()和 recvfrom ()调用之间
*
fd_zero (readSet);
fD_set (服务器、readSet);
addrlen = sizeof (clientAddr);

/*等待答复*/
Status = select (server + 1、readSet、NULL、NULL、NULL);
如果(状态> 0){
if (fd_isset (server、readSet)){
bytesRcvd = recvfrom (服务器、缓冲区、UDPPACKETSIZE、0、
(struct sockaddr *)&clientAddr、&addrlen);
Buffer[bytesRcvd]= 0;
如果(bytesRcvd >0){
IPTmp = ntohl (clientAddr.sin addr.s_addr);
Display_printf (g_SMCDisplay、0、0、"remoteIp:\t:%d.%d.%d:%d\n"、(uint8_t)(IPTmp>>24)&0xFF、
(uint8_t)(IPTmp>>16)&0xFF、
(uint8_t)(IPTmp>>8)&0xFF、
(uint8_t) IPTmp&0xFF、
clientAddr.sin 端口
);
// System_printf ("remoteIp:\t:%d.%d.%d.%d:%d\n"、(uint8_t)(IPTmp>>24)&0xFF、
// (uint8_t)(IPTmp>>16)&0xFF、
// (uint8_t)(IPTmp>>8)&0xFF、
// (uint8_t) IPTmp&0xFF、
// clientAddr.sin 端口);
// system_flush();

pManufacturerInformation = INFO_GET();
// n = sprintf (响应、"系统主控制器 ID:%06d"、pManufacturerInformation->unitSerialNumber);
#ifdef test_s固定 装置
N = sprintf (响应、"SMC 测试装置 ID:%06d"、pManufacturerInformation->unitSerialNumber);
#else
N = sprintf (响应、"系统主控制器 ID:%06d"、pManufacturerInformation->unitSerialNumber);
#endif
字节 Sent = sendto (server、response、n、0、(struct sockadr *)&clientAddr、 addrlen);
if (bytesSent!= n){
Display_printf (g_SMCDisplay、0、0、"错误:Sendto 失败。\n");
// System_printf ("错误:UDP sendto 失败。\n");
// system_flush();

}
}

}
while (status > 0);

shutdown:
if (server!=-1){
关闭(服务器);
}

fdCloseSession(TaskSele());

返回(NULL);
} 

这是我的代码中具有的最大套接字数

/*套接字文件描述符表*/
#define MAXSOCKETS 10
uint32_t ti_NDK_socket_max_FD = MAXSOCKETS;
void * ti_NDK_socket_fdtable[MAXSOCKETS]; 

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

    您好!

    是否可以尝试减少套接字的数量?

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

    您好!

    我尝试仅运行2个套接字、但仍然有相同的问题。

    一个运行原始 UDP 服务器。 然后尝试使用不同的 UDP 端口调用相同的 UDP 服务器任务、并在绑定函数上给出错误。

    谢谢

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

    我在创建任务时发现、我使用的是指向静态变量的指针。 通过这种方式、我发送了要用于打开 UDP 服务器的端口号。 由于我重复使用该静态变量来创建第二台服务器,因此我在创建第一台服务器后立即对其进行修改,以便创建第二台服务器。 到第一台服务器启动时、端口号设置为第二台、因此两台服务器都尝试在同一个端口上打开。 这就是第二台服务器返回错误的原因。