gpt4 book ai didi

c - 为什么我无法在 Ubuntu 中创建原始套接字?

转载 作者:行者123 更新时间:2023-11-30 17:17:59 25 4
gpt4 key购买 nike

我正在学习如何在 Linux 中使用原始套接字。我正在尝试创建一个这样的套接字:

if ((sd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) {
perror("socket() failed");
exit(-1);
}

但是发布后我得到的只是:

socket() failed: Operation not permitted

我知道只有 root 可以创建原始套接字,但如果我使用 SUID 位或 sudo 运行它 -问题是一样的。怎么了?系统是Ubuntu 11.04。

也许我包含了不必要的 header ?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <netdb.h>
#include <sys/time.h>
#include <signal.h>
#include <unistd.h>

我想知道 - 为什么 SUID 没用?

最佳答案

我的钱是你没有正确运行你的代码。

我已将您的确切代码复制并粘贴到空的 main() 中。如果我自己运行它,我会得到同样的错误,但它在 sudo 下运行正确。这是在 Ubuntu 上。

代码:

#include <sys/socket.h>
#include <netinet/in.h>

int main()
{
int sd;
if ((sd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) {
perror("socket() failed");
return -1;
}
return 0;
}

以我自己的身份运行:

aix@aix:~$ ./a.out 
socket() failed: Operation not permitted
aix@aix:~$

以 root 身份运行:

aix@aix:~$ sudo ./a.out 
aix@aix:~$

关于c - 为什么我无法在 Ubuntu 中创建原始套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29329930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com