मैं POSIXy C++ में परत 2 पैकेट कैसे प्राप्त करूं? पैकेट में केवल src और dst मैक पता, प्रकार/लंबाई, और कस्टम स्वरूपित डेटा है। वे टीसीपी या यूडीपी या आईपी या आईजीएमपी या एआरपी या जो कुछ भी नहीं हैं - वे हार्डवेयर लोगों द्वारा मुझे दिए गए घर-निर्मित प्रारूप हैं।मैं सी/सी ++ में कच्चे, परत 2 पैकेट कैसे प्राप्त करूं?
मेरा socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW)
कभी भी recvfrom()
से वापस नहीं आता है।
मैं ठीक भेज सकता हूं, मुझे कोई फर्क नहीं पड़ता कि मैं नेटवर्क स्टैक पर किस विकल्प को घुमाता हूं।
(प्लेटफार्म VxWorks है, लेकिन मैं इसे POSIX या लिनक्स या जो कुछ भी ... अनुवाद कर सकते हैं)
कोड (वर्तमान अवतार) प्राप्त करते हैं:
int s;
if ((s = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW)) < 0) {
printf("socket create error.");
return -1;
}
struct ifreq _ifr;
strncpy(_ifr.ifr_name, "lltemac0", strlen("lltemac0"));
ioctl(s, IP_SIOCGIFINDEX, &_ifr);
struct sockaddr_ll _sockAttrib;
memset(&_sockAttrib, 0, sizeof(_sockAttrib));
_sockAttrib.sll_len = sizeof(_sockAttrib);
_sockAttrib.sll_family = AF_PACKET;
_sockAttrib.sll_protocol = IFT_ETHER;
_sockAttrib.sll_ifindex = _ifr.ifr_ifindex;
_sockAttrib.sll_hatype = 0xFFFF;
_sockAttrib.sll_pkttype = PACKET_HOST;
_sockAttrib.sll_halen = 6;
_sockAttrib.sll_addr[0] = 0x00;
_sockAttrib.sll_addr[1] = 0x02;
_sockAttrib.sll_addr[2] = 0x03;
_sockAttrib.sll_addr[3] = 0x12;
_sockAttrib.sll_addr[4] = 0x34;
_sockAttrib.sll_addr[5] = 0x56;
int _sockAttribLen = sizeof(_sockAttrib);
char packet[64];
memset(packet, 0, sizeof(packet));
if (recvfrom(s, (char *)packet, sizeof(packet), 0,
(struct sockaddr *)&_sockAttrib, &_sockAttribLen) < 0)
{
printf("packet receive error.");
}
// code never reaches here
बहुत बढ़िया सवाल! –
मुझे खुशी है कि आपने इस पॉज़िक्स को टैग किया है, शुभकामनाएं विंडोज पर ऐसा करने की कोशिश कर रही हैं;) –
बस एक नाइटपिक: POSIX सी ++ बाइंडिंग को परिभाषित नहीं करता है, केवल सी –