gpt4 book ai didi

c - 在原始套接字上 Ping 数据包

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:54:26 24 4
gpt4 key购买 nike

我正在尝试在 veth 接口(interface)上接收 ping 数据包。但我在接收方看不到任何东西。当我进行 TCP 转储时,我可以看到数据包。这是我的代码。

s_int32_t checkingRawSocket(void) {

int sockfd;
char ifName[IFNAMSIZ];
fd_set readfds;
int m_sd;
int retVal;
int sockopt;

strcpy(ifName, "ve12");

if ((sockfd = socket(AF_PACKET, SOCK_RAW,htons(IPPROTO_ICMP))) == -1) {
perror("NOT LISTNER: socket");
goto EXIT;
}

retVal = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR,
(char *)&sockopt, sizeof(sockopt));
if (retVal < 0){
perror("setsockopt() failed");
goto EXIT;
}

if (setsockopt(sockfd, SOL_SOCKET,
SO_BINDTODEVICE, ifName, IFNAMSIZ-1) == -1) {
perror("SO_BINDTODEVICE");
retVal = -1;
goto EXIT;
}
FD_ZERO(&readfds);
m_sd = sockfd;
FD_SET(sockfd, &readfds);

if(select(m_sd + 1, &readfds, NULL, NULL, 0) < 0){
perror("SELECT FAILED ");
goto EXIT;
}

printf("I got something after select");

EXIT:
return -1;
}

所以我在 ve12p 上执行 ping 操作。它永远不会越过 select 并到达 print 语句。

ping -I ve12p 1.1.1.1

我检查了 veth 接口(interface),它们已经启动,我可以在 ve12 的 tcpdump 上看到数据包。

最佳答案

我不认为 IPPROTO_ICMP 在使用 AF_PACKET 域时是有效的协议(protocol)。您可以尝试使用以下方式接收所有协议(protocol):

socket(AF_PACKET, SOCK_RAW,htons(ETH_P_ALL))

或者,您可以为协议(protocol) IPPOROTO_ICMP 使用正确的域 AF_INET:

socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)

编辑:

socket(7) 手册页指出数据包套接字不支持 SO_BINDTODEVICE,应该使用普通的 bind()

关于c - 在原始套接字上 Ping 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22726500/

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