2009-04-12 10 views
8

मैं निम्नलिखित की कोशिश की। इस मामले में क्या होगा? क्या कनेक्शन कभी प्राप्त करना असंभव होगा, क्योंकि इसमें कोई स्थानीय पता या बंदरगाह नहीं है? या यह स्पष्ट रूप से एक स्थानीय पता और बंदरगाह सौंपा गया था, और अब यह उन पर सुन रहा है? यदि हां, तो मैं उन्हें कैसे प्राप्त कर सकता हूं?() सुनने बाँध बुला बिना()

उत्तर

10

कॉल काम कर रहे हैं, लेकिन जब से तुम सॉकेट स्पष्ट रूप से बाध्य नहीं किया था, ऑपरेटिंग सिस्टम या प्रणाली पुस्तकालय परोक्ष एक बंदरगाह और डिफ़ॉल्ट आप के लिए बाध्यकारी (के रूप में जब आप bind(2) बुला पहले बिना connect(2) फोन बिल्कुल वैसा ही) सौंपा। इसके अलावा, चूंकि आपने पहले टीसीपी सामान के बारे में पूछा था, मुझे लगता है कि आप यहां इंटरनेट सॉकेट के बारे में बात कर रहे हैं।

ऑपरेटिंग सिस्टम के बीच ओएस को सॉकेट करने के लिए ओएस को किस नाम से अलग करना है, तो आपको यह पता लगाना होगा कि आपको अपने विशिष्ट ओएस की तलाश करनी होगी, लेकिन अधिकांश ऑपरेटिंग सिस्टम netstat या इसी तरह के टूल प्रदान करते हैं जिसका उपयोग आप यह जानने के लिए कर सकते हैं कि कौन से एप्लिकेशन सुन रहे हैं किस बंदरगाह पर,

जैसा कि जॉन ने टिप्पणी में उल्लेख किया है, आप बाउंड सॉकेट के नाम को खोजने के लिए getsockname(2) का उपयोग कर सकते हैं।

// ... 

// Create socket and set it to listen (we ignore error handling for brevity) 
int sock = socket(AF_INET, SOCK_STREAM, 0); 
listen(sock, 10); 

// Sometime later we want to know what port and IP our socket is listening on 
socklen_t addr_size = sizeof(struct sockaddr_in); 
struck sockaddr_in addr; 
getsockname(sock, (struct sockaddr *)&addr, &addr_size); 

addr अब आईपी पते और पोर्ट है कि आपके सॉकेट पर सुन रहा है में शामिल होंगे: यहाँ एक छोटी उदाहरण है।

+0

getockname() कॉल आपको ओएस असाइन किया गया पता/पोर्ट देगा। –

+0

अच्छा बिंदु, जॉन ... मैं एक उदाहरण कोड जोड़ दूंगा। –

0

मुझे संदेह है कि आपको कभी कनेक्शन नहीं मिलेगा। आप प्रोग्राम को चलाने से पहले और बाद में अपने ओएस पर "netstat -an" के बराबर कर कर एक नई सॉकेट सुन सकते हैं या नहीं।

मैं सी # में एक ही बात करने की कोशिश की:

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
socket.Listen(1); 
socket.Accept(); 

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

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
socket.Bind(new IPEndPoint(IPAddress.Loopback, 4567)); 
socket.Listen(1); 
socket.Accept(); 

मैं भी UDP सॉकेट और एक ही बात के साथ परीक्षण किया, विंडोज फोन सुनें सेवा पर जब तक कि एक बाध्यकारी किया गया है खुश नहीं है: निश्चित रूप से इसके साथ ठीक काम करता है। चूंकि नेट सॉकेट कॉल केवल विंसॉक के चारों ओर रैपर हैं, इसलिए यह व्यवहार विंडोज़ पर सभी विंसॉक व्युत्पन्न पुस्तकालयों के लिए समान है।

2

जैसा कि अन्य लोगों ने उल्लेख किया है, यदि आप बाध्य नहीं करते हैं तो ओएस एक पोर्ट असाइन करेगा। आप क्या पता/बंदरगाह असाइन किए गए हैं यह देखने के लिए आप सुनने के बाद getsockname() कॉल का उपयोग कर सकते हैं। फिर यदि आपने उस पते/पोर्ट को क्लाइंट को सूचित किया है, तो यह कनेक्ट हो सकता है।

तो यह समझ में आता है कि यह काम करता है। आप एक प्रोग्राम लिख सकते हैं जहां यह करना एक दिलचस्प बात थी।