首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Linux上对以太网` `socket(AF_INET,.,.)使用``sendto()‘(IP输出数据包)时修复` `EPERM`’错误

如何在Linux上对以太网` `socket(AF_INET,.,.)使用``sendto()‘(IP输出数据包)时修复` `EPERM`’错误
EN

Stack Overflow用户
提问于 2022-11-21 17:16:18
回答 1查看 28关注 0票数 0

下面是一个大规模简化的代码示例,下面是我的世界回购中的代码,下面是一个模式:GREAT.c

代码语言:javascript
复制
#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返回代码被设置为-1errno设置为EPERMEPERM的意思是“权限错误:‘e’‘rror’PERM‘省去”。所有可能的errno错误的列表都可以在这里找到:https://man7.org/linux/man-pages/man3/errno.3.html。它显示:

不允许EPERM操作(POSIX1.2001)。

但是,我为函数提供的3页参考页面的none显示EPERM是调用该函数的有效甚至可能的错误条件!以下是我为sendto()提供的3个参考页面。请参见其中每个部分的“错误”或“返回值”部分:

  1. POSIX程序员sendto()手册:https://man7.org/linux/man-pages/man3/sendto.3p.html
  2. 用于sendto()的man7.org "Linux程序员手册“:https://man7.org/linux/man-pages/man2/send.2.html
  3. Linux.die.net sendto()手册:https://linux.die.net/man/2/sendto

那么,发生了什么事,我该怎么解决呢?我希望sendto()能够工作,这样我就可以向连接的设备发送一个以太网UDP数据包。在其他机器上,它可以正常工作,但从我的嵌入式Linux板上看,它在EPERM上失败了。

EN

回答 1

Stack Overflow用户

发布于 2022-11-21 17:16:18

如何通过禁用防火墙来修复EPERM (权限错误;‘E’‘rror’PERM‘疏漏)

经过大量的研究,谷歌搜索,在嵌入式Linux板上进行测试等等,我确定这仅仅是因为我有防火墙阻塞了我的外发流量。这样做可以禁用防火墙,然后再试一次,EPERM错误就会消失:

代码语言:javascript
复制
# 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返回-1errno设置为EPERM (不允许操作)。 sendto (2)手动页面没有提到任何关于EPERM错误的内容。 我通过谷歌搜索发现,如果本地防火墙不允许发送UDP 数据包,sendto 可能会与 == EPERM 一起失败。E 229

另请参阅:

  1. https://stackoverflow.com/a/73302873/4561887
  2. 谷歌搜索"socket EPERM“
  3. 谷歌搜索"socket sendto EPERM“
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74522604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档