好的,首先是代码:
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
升级,因为我希望它是一个有问题的库或类似的东西。我可以在星期一回来查看,但也许这里有人有另一个想法是什么问题。