下面是一个大规模简化的代码示例,下面是我的世界回购中的代码,下面是一个模式:GREAT.c
#define SOCKET_TYPE_UDP_IPV4 AF_INET, SOCK_DGRAM, 0
// Create an IPv4 UDP socket to send Ethernet packets out to a connected device
int socket_fd = socket(SOCKET_TYPE_UDP_IPV4);
// Send a packet via `sendto()`
const char msg_to_send[] = "Hello from client.";
ssize_t num_bytes_sent = sendto(socket_fd, msg_to_send, sizeof(msg_to_send), 0,
(const struct sockaddr *)&addr_server, sizeof(addr_server));
if (num_bytes_sent == -1)
{
printf("Failed to send to server. errno = %i: %s\n", errno, strerror(errno));
goto cleanup;
}然而,sendto()失败了,因为num_bytes_sent返回代码被设置为-1,errno设置为EPERM。EPERM的意思是“权限错误:‘e’‘rror’PERM‘省去”。所有可能的errno错误的列表都可以在这里找到:https://man7.org/linux/man-pages/man3/errno.3.html。它显示:
不允许
EPERM操作(POSIX1.2001)。
但是,我为函数提供的3页参考页面的none显示EPERM是调用该函数的有效甚至可能的错误条件!以下是我为sendto()提供的3个参考页面。请参见其中每个部分的“错误”或“返回值”部分:
sendto()手册:https://man7.org/linux/man-pages/man3/sendto.3p.htmlsendto()的man7.org "Linux程序员手册“:https://man7.org/linux/man-pages/man2/send.2.htmlsendto()手册:https://linux.die.net/man/2/sendto那么,发生了什么事,我该怎么解决呢?我希望sendto()能够工作,这样我就可以向连接的设备发送一个以太网UDP数据包。在其他机器上,它可以正常工作,但从我的嵌入式Linux板上看,它在EPERM上失败了。
发布于 2022-11-21 17:16:18
如何通过禁用防火墙来修复EPERM (权限错误;‘E’‘rror’PERM‘疏漏)
经过大量的研究,谷歌搜索,在嵌入式Linux板上进行测试等等,我确定这仅仅是因为我有防火墙阻塞了我的外发流量。这样做可以禁用防火墙,然后再试一次,EPERM错误就会消失:
# Manually disable the firewall
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t filter --flush例如,帮助我得出这一结论的一个消息来源是DmitryV.Krivenok这里的问题:UDP套接字& sendto & EPERM (着重号是补充的):
当我轮询几百个设备时,程序运行得很好,但当我轮询数千个设备时,会出现奇怪的错误:
sendto返回-1,errno设置为EPERM(不允许操作)。sendto(2)手动页面没有提到任何关于EPERM错误的内容。 我通过谷歌搜索发现,如果本地防火墙不允许发送UDP 数据包,sendto可能会与 ==EPERM一起失败。E 229
另请参阅:
https://stackoverflow.com/questions/74522604
复制相似问题