2009-03-31 13 views
5

मैं है लिनक्स के तहत सी में ठेठ कोड यूडीपी डेटा प्राप्त करने के बाद:मैं सी में प्रेषक का यूडीपी पोर्ट कैसे प्राप्त करूं?

sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); 
mysock.sin_family = AF_INET; 
mysock.sin_addr.s_addr = INADDR_ANY; 
mysock.sin_port = my_port; 
bind(sock, &mysock, sizeof(mysock); 
recvfrom(sock, buf, PKTSZ, 0, &client, len); 

उपरोक्त सभी कोड काम करता है, लेकिन अब मैं प्रेषक के UDP पोर्ट पता लगाने के लिए एक की जरूरत है, वहाँ एक संरचना या प्रणाली है जब मैं udp पैकेट प्राप्त करता हूं तो क्या मैं ऐसी जानकारी पुनर्प्राप्त करने के लिए उपयोग कर सकता हूं?

धन्यवाद

उत्तर

6

recvfrom() पांचवें तर्क (struct sockaddr *) में है कि वापस जाने के लिए आप के लिए माना जाता है।

संपादित करें: प्रेषक के बंदरगाह होना चाहिए इस

struct sockaddr_in client; 

recvfrom(... (struct sockaddr*)&client ...); 

client.sin_port तरह कुछ का प्रयोग करें।

+0

मैं पहले उस तर्क को देखता हूं लेकिन संरचना सॉकडर के पास कोई प्रेषक की udp पोर्ट जानकारी नहीं है, जब तक कि यह sa_data के अंदर एम्बेडेड न हो। –

1

यूडीपी प्रेषक बंदरगाह क्षणिक होगा। मुझे नहीं लगता कि आप रिपोर्टिंग के अलावा किसी अन्य चीज़ के लिए इसका इस्तेमाल कर सकते हैं।

+0

मैं खुद को स्पष्ट नहीं कर सकता, मुझे प्रेषक के udp बंदरगाह को जानने की आवश्यकता है ताकि मैं तुरंत डेटा भेज सकूं, इसलिए यह क्षणिक होना ठीक है। –

+0

आप केवल एक सुनवाई udp सॉकेट पर डेटा भेज सकते हैं। यह असंभव है कि आपका प्रेषक सॉकेट भी एक सुनवाई सॉकेट है। अगर आपको इस व्यवहार की ज़रूरत है, तो आपको दोनों तरफ udp सॉकेट सुनना होगा। – Indy9000

11

recvfrom (सॉक, buf, PKTSZ, 0, & क्लाइंट, लेन);

प्रेषकों सॉकेट पते के अपने कोड की ग्राहक चर में संग्रहित है। sockaddr के बजाय प्रेषक बंदरगाह का उपयोग sockaddr_in का उपयोग करने के लिए। उदाहरण:

sockaddr_in client; 
int len = sizeof(client); 
recvfrom(sock, buf, PKTSZ, 0, (struct sockaddr *)&client, (socklen_t *)&len); 
int port = ntohs(client.sin_port); 

संदर्भ: Beej's Guide to Network Programming और MSDN

+0

reinterpret_cast यहां से संबंधित नहीं है। ओपी ने सी (सी ++ नहीं) – sigjuice

+0

डिट्टो - डाउनवोट के लिए पूछा जब तक कि कास्ट सही नहीं किया जाता – Alnitak

0

पांचवें तर्क struct sockaddr_in लिए डाली जा सकती है, और वहाँ sin_port दूरस्थ पोर्ट संख्या है।

0

धन्यवाद दोस्तों, sockaddr_in पर क्लाइंट कास्टिंग मेरी समस्या हल करता है और त्वरित प्रतिक्रिया के लिए गहराई से सराहना करता है, उम्मीद है कि किसी दिन मैं इस सामग्री के साथ बेहतर होने पर योगदान कर सकता हूं।

+2

सही उत्तर चुनकर थोड़ा योगदान दें :) – dwc

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