Я пытаюсь получить пакеты ping на интерфейсе veth. Но я не вижу ничего на стороне приема. Я вижу пакет, когда я делаю дамп 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 -I ve12p 1.1.1.1
Я проверил интерфейсы veth, они подняты, и я вижу пакет на tcpdump ve12.
Следует избегать использования 'goto', это не Fortran. Почему вы используете 'goto EXIT', когда можете просто использовать' return -1'? – Havenard
, когда 'select' success вы можете вызвать функцию' recv', например 'recv (sockfd, buf, sizeof (buf), 0))' И 'print' данные' buf'. –
@havanard .. это что-то сделать, чтобы код не работал? – Rags