简体   繁体   English

在原始套接字上ping数据包

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM