【发布时间】:2015-10-03 11:06:51
【问题描述】:
好的,首先是代码:
int recvMast_sock;
struct sockaddr_in serv_addr, cli_addr;
socklen_t cli_len;
if ((recvMast_sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
critErr("listen:socket=");
}
fillSockaddrAny(&serv_addr, UDP_NODE_LISTEN_PORT);// fills the sockaddr_in works fine elsewhere
if ((bind(recvMast_sock, (struct sockaddr*) &serv_addr, sizeof serv_addr)) < 0)
{
critErr("listen:bind recv_mast_sock:");
}
recvReturn_i = recvfrom(recvMast_sock, &recvBuff[0], (size_t)1, 0, (struct sockaddr*) &cli_addr, &cli_len);
if(recvReturn_i <0)
printf("recv error%d\n",errno);
critErr 是一个处理错误的函数,其中还包括错误的打印和exit。
如果有任何相关性,这将在一个线程中运行。如果我在具有 ARM Cortex A9 和 Linaro Linux(基于精确的 Ubuntu)的 Zedboard(ZYNQ-7000 SoC)上编译并运行它。它打印错误22,但在recvBuff[0] 中仍有接收到的值。
使用 xubuntu 在我的虚拟机中运行它可以正常工作。
错误22 等于EINVAL,这被描述为无效参数。
在recvfrom(2) 的联机帮助页中,它声明EINVAL 表示设置了MSG_OOB 标志,但我没有使用任何标志(通过0)。
在星期五离开之前,我开始了apt-get 升级,因为我希望它是一个有问题的库或类似的东西。我可以在星期一回来查看,但也许这里有人有另一个想法是什么问题。
【问题讨论】:
-
我非常怀疑这与架构有关,而是检查设置是否正常。
-
设置在什么意义上。是安装linux还是硬件?除此以外,网络工作正常。这不是第一次调用 recvfrom。
-
两者都可能,但我会先检查 linux 安装。他们都是同一个Ubuntu吗?
-
如前所述,VM 运行 xubuntu (15.04),另一个是 linaro(基于精确 Ubuntu)
-
这似乎是一个旧的,我不是 Ubuntu 的粉丝,但从我的记忆中精确是旧的。某些库函数中可能确实存在错误。尝试在虚拟机上安装 linaro 并检查它是否仍然重现问题,如果没有,您可以 也许 归咎于架构,但我不明白这是怎么回事特定问题可能与此有关。