2014-03-29 49 views
1

我試圖在veth接口上接收ping數據包。但我在接收方看不到任何東西。當我執行TCP轉儲時,我可以看到數據包。這是我的代碼。在原始套接字上Ping數據包

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; 
} 

所以我做了一個ping ve12p。它從不穿過select並達到print語句。

ping -I ve12p 1.1.1.1 

我檢查了veth接口,它們都起來了,我可以在ve12的tcpdump上看到數據包。

+0

應該避免使用'goto',這不是Fortran。當你簡單地使用'return -1'時,你爲什麼使用'goto EXIT'? – Havenard

+0

當'select'成功時,你可以調用'recv'函數,例如'recv(sockfd,buf,sizeof(buf),0))''並且'打印'buf'數據。 –

+1

@havanard ..是否有任何事情做的代碼不工作? – Rags

回答

2

我不相信IPPROTO_ICMP是使用AF_PACKET域時的有效協議。你既可以嘗試使用接收所有協議:

socket(AF_PACKET, SOCK_RAW,htons(ETH_P_ALL)) 

或者,你可以使用正確的域AF_INET的協議IPPOROTO_ICMP

socket(AF_INET, SOCK_RAW, IPPROTO_ICMP) 

編輯:

插座(7)人頁面指​​出SO_BINDTODEVICE不支持數據包套接字,並且應該使用正常的bind()

相關問題