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上看到數據包。
應該避免使用'goto',這不是Fortran。當你簡單地使用'return -1'時,你爲什麼使用'goto EXIT'? – Havenard
當'select'成功時,你可以調用'recv'函數,例如'recv(sockfd,buf,sizeof(buf),0))''並且'打印'buf'數據。 –
@havanard ..是否有任何事情做的代碼不工作? – Rags