2013-07-17 4 views
5

लिनक्स पर, जब तक कि मुझे गलत न हो, एक एप्लिकेशन सॉकेट कॉल परिवार का उपयोग डेटाग्राम ट्रांसपोर्ट पर एक समय में एक पैकेट भेजने या प्राप्त करने के लिए कर सकता है।एकल सिस्टम कॉल में एकाधिक डेटाग्राम प्राप्त करना

जानना चाहते हैं कि लिनक्स डेटाग्राम ट्रांसपोर्ट पर एक ही कॉल में एकाधिक पैकेट भेजने और प्राप्त करने के लिए एप्लिकेशन का माध्यम प्रदान करता है या नहीं।

+1

यह से उपलब्ध नहीं है बीएसडी एपीआई द्वारा (यही वह है जिसे आप सीए करते हैं "सॉकेट कॉल परिवार" lled – nouney

+2

लिनक्स पर आप sendmmsg syscall – PlasmaHH

उत्तर

7

उपयोग recvmmsg कई आंकड़ारेख पैकेट (उदाहरण के यूडीपी)

int recvmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen, 
        unsigned int flags, struct timespec *timeout); 
DESCRIPTION   
    The recvmmsg() system call is an extension of recvmsg(2) that allows 
    the caller to receive multiple messages from a socket using a single 
    system call. ... 

http://man7.org/linux/man-pages/man2/recvmmsg.2.html

sendmmsg उपयोग भेजने के लिए प्राप्त करने के लिए ...

int sendmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen, 
        unsigned int flags); 
DESCRIPTION   
    The sendmmsg() system call is an extension of sendmsg(2) that allows 
    the caller to transmit multiple messages on a socket using a single 
    system call. 

http://man7.org/linux/man-pages/man2/sendmmsg.2.html

0

लिनक्स पर ऐसी कोई कॉल नहीं है। हालांकि, निर्भर करता है कि तुम क्या जरूरत है, वहाँ विकल्प हैं:

  • दोनों sendmsg() और recvmsg() "बिखराव/इकट्ठा" कर सकते हैं - भेजने/एकाधिक बफ़र्स से एक पैकेट प्राप्त करते हैं।
  • "pktgen" (http://www.linuxfoundation.org/collaborate/workgroups/networking/pktgen) एक कर्नेल मॉड्यूल है जो परीक्षण उद्देश्यों के लिए केवल कुछ हद तक फ़ाइल लिखने के साथ लाखों पैकेट प्रेषित कर सकता है।
+0

पर एक नज़र डालना चाहते हैं, अभी के लिए, मैं अपने उद्देश्य को हल करने के लिए async IO कॉल के io _ *() परिवार का उपयोग कर रहा हूं। एसिंक आईओ एक धोखाधड़ी का थोड़ा सा है, लेकिन यह एक समय में कई पैकेट भेजने/प्राप्त करने में सुविधा प्रदान करता है। – Maddy

संबंधित मुद्दे