[英]Ping packets on raw sockets
I am trying to receiving ping packets on a veth interface. 我试图在veth接口上接收ping数据包。 But I can't see anything on receive side. 但我在接收方面看不到任何东西。 I can see the packet when I do a TCP dump. 我在进行TCP转储时可以看到数据包。 Here is my code. 这是我的代码。
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;
}
So I do a ping on ve12p. 所以我在ve12p上做了一个ping。 It never crosses select and reaches the print statement . 它永远不会越过select并达到print语句。
ping -I ve12p 1.1.1.1
I checked the veth interfaces, they are up and I can see the packet on tcpdump of ve12. 我检查了veth接口,它们已经启动,我可以看到ve12的tcpdump上的数据包。
I don't believe IPPROTO_ICMP
is a valid protocol when using an AF_PACKET
domain. 使用AF_PACKET
域时,我不相信IPPROTO_ICMP
是有效的协议。 You could either try receiving all protocols by using: 您可以尝试使用以下方法接收所有协议:
socket(AF_PACKET, SOCK_RAW,htons(ETH_P_ALL))
Or, you could use the correct domain AF_INET
for the protocol IPPOROTO_ICMP
: 或者,您可以使用正确的域AF_INET
作为协议IPPOROTO_ICMP
:
socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)
Edit: 编辑:
The socket(7) man page states that SO_BINDTODEVICE is not supported for packet sockets and that a normal bind()
should be used. socket(7)手册页指出数据包套接字不支持SO_BINDTODEVICE,并且应该使用普通的bind()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.