工具/软件:
您好:
我 在 AM572x 上使用 NDK 2.26.00.08。 是在 RTOS 环境中
问题: 广播回复耗尽了网络缓冲区、似乎整个网络都卡住了。 不确定如何增加 pktNumFrameBufs(或替代调优方法)
目标是接收广播并发送一个作为回报。
我将分享一段关于如何初始化和如何发送的信息。
只要对 send 函数进行注释、一切都正常。 我发送超过 9k 的数据(在 1024x9512x18 或 1400x7...中)。 网络堆栈(TCP/IP 或其它方面)似乎已崩溃。 从另一个线程访问网络将导致应用崩溃。
我认为这是一个配置问题 — 但到目前为止我还没有找到“魔法要点“...
static int initBroadcastSocket (socket* SOCK_OUT){
结构 sockaddr_in addr;
INT optval = 1;
套接字 sock = socket (AF_INET、SOCK_DGRAM、IPPROTO_UDP);
if (sock == INVALID_SOCKET){
ip_print(“ip scanner - socket faile\n“);
返回–1;
}
setsockopt (sock、SOL_SOCKET、SO_BROADCAST、&optval、sizeof (optval));
setsockopt (sock、SOL_SOCKET、SO_REUSEADDR、&optval、sizeof (optval));
memset (&addr、0、sizeof (addr));
Addr.sin_family = AF_INET;
Addr.sin_port = htons (MULTICASTPORT_S);
addr.sin_addr.s_addr = htonl (addr_any);
if (OSAL_SOCKET_UDP_BIND (SOCK、&addr、sizeof (addr))< 0){
ip_print(“IP 扫描仪 — 绑定失败\n“);
OSAL_SOCKET_CLOSE (SOCK);
返回–1;
}
*SOCK_OUT = SOCK;
返回 0;
}
struct in_addr ip_addr = client_addr->sin_addr;
struct in_addr subnet_mask;
subnet_mask.s_addr = htonl (0xFFFFFF00);
结构体 in_addr BROADCAST_addr;
broadcast_addr.s_addr = ip_addr.s_addr |~subnet_mask.s_addr;
struct sockaddr_in replice_addr ={0};
Replice_addr.sin_family = AF_INET;
replice_addr.sin_port = htons (request->response_port);
Replice_addr.sin_addr = BROADCAST_addr;
int SENT = sendto (sock、json_buffer、sizeof (json_buffer)、0、&reply_addr、 sizeof (replice_addr);
可以看到、json_buffer 只是一个随机的 json 可以正常工作、并且有一个客户端接收它。
在同一个系统上,我也有一个运行相同版本的代码的 Linux(适应 Linux ),但没有发生。
我还会提到、该应用正在运行 TCP 协议栈而没有出现任何问题。