2009-11-17 6 views
7

मुझे अपने कार्यक्रम, मेरी पहली असली Erlang कार्यक्रम पर एक अच्छी शुरुआत मिली है। मैंने इसे संदेशों के लिए सुनना, उन्हें पढ़ना और उन्हें पार्स करना है। मैं इसे भी भेज रहा हूं। एक छोटी सी चीज जो मुझे परेशान कर रही है वह है कि मैं पोर्ट 5353 पर नहीं भेज सकता, मैंने सब कुछ करने की कोशिश की है। मेरी मशीन पर अन्य सभी एप्लिकेशन पोर्ट 5353, सबइथाएडिट, आईट्यून्स, आईकैट पर सुन सकते हैं और भेज सकते हैं।मल्टीकास्ट संदेश कैसे भेजें और Erlang में एक बंदरगाह का पुन: उपयोग करें?

समाधान पोर्ट 5353 पर प्रसारण भेजना चाहिए और यही कारण है कि।

"एक प्राप्त मल्टीकास्ट DNS पूछताछ में स्रोत UDP पोर्ट बंदरगाह 5353 नहीं है तो इससे पता चलता है कि ग्राहक क्वेरी होने वाले एक सरल ग्राहक कि पूरी तरह से मल्टीकास्ट DNS के सभी। को लागू नहीं करता है इस में है मामले में, मल्टीकास्ट डीएनएस रेस्पॉन्डर को यूपीपी प्रतिक्रिया सीधे ग्राहक को यूनिकास्ट के माध्यम से, क्वेरी पैकेट के स्रोत आईपी पते और बंदरगाह पर भेजना होगा। यह यूनिकास्ट प्रतिक्रिया पारंपरिक यूनिकास्ट प्रतिक्रिया होना चाहिए जैसा पारंपरिक द्वारा उत्पन्न किया जाएगा यूनिकास्ट DNS सर्वर; उदाहरण के लिए, क्वेरी क्वेरी में दिए गए क्वेरी आईडी और प्रश्न को दोहराना होगा। "

वे सभी पोर्ट: 5353 मल्टीकास्ट संदेश भेजते समय रिपोर्ट करते हैं। मैं वास्तव में चाहता हूं कि मेरा एप्लिकेशन अच्छा खेलें और वही काम करें, पोर्ट 5353 पर भेजें। यहां मेरा मॉड्यूल है क्योंकि यह अभी खड़ा है।

-module(zeroconf). 

-include("zeroconf.hrl"). 

-export([open/0,start/0]). 
-export([stop/1,receiver/0]). 
-export([send/1]). 

-define(ADDR, {224,0,0,251}). 
-define(PORT, 5353). 

send(Domain) -> 
    {ok,S} = gen_udp:open(0,[{broadcast,true}]), % I really want this Port to be 5353 :-(
    % this doesn't complain or throw errors but it also doesn't work :-(  
    %{ok,S} = gen_udp:open(?PORT,[{reuseaddr,true}, {ip,?ADDR}, {broadcast,true},multicast_ttl,4}, {multicast_loop,false}, binary]), 
    P = #dns_rec{header=#dns_header{},qdlist=[#dns_query{domain=Domain,type=ptr,class=in}]}, 
    gen_udp:send(S,?ADDR,?PORT,inet_dns:encode(P)), 
    gen_udp:close(S). 

यहां कुछ आउटपुट दिखता है।

यह SubEthaEdit से एक प्रश्न स्थानीय नेटवर्क पर अन्य उदाहरण के लिए देख रहा है, नोटिस में यह कहा गया है कि पोर्ट: 5353

From: {192,168,0,105} 
Port: 5353 
Data: {ok,{dns_rec,{dns_header,0,true,'query',true,false,false,false,false,0}, 
        [], 
        [{dns_rr,"_see._tcp.local",ptr,in,0,0, 
          "[email protected]_see._tcp.local",undefined,[], 
          false}], 
        [],[]}} 
अब यहाँ

मेरी मॉड्यूल से एक प्रश्न स्थानीय नेटवर्क पर iTunes के उदाहरण के लिए देख रहा है , नोटिस यह कहता है पोर्ट: 59795 कोड के साथ जिस तरह से यह है, वह बंदरगाह यादृच्छिक है। मैं वास्तव में यह होना चाहते हैं 5353.

From: {192,168,0,105} 
Port: 59795 
Data: {ok,{dns_rec,{dns_header,0,false,'query',false,false,false,false,false, 
           0}, 
        [{dns_query,"_daap._tcp.local",ptr,in}], 
        [],[],[]}} 

किसी को भी सब पर यूडीपी बहुस्त्र्पीय करने में किसी भी रहस्यमय अंतर्दृष्टि है? अपडेट कर रहा है इसलिए मैं एक उत्तर को आजमा सकते हैं और स्वीकार कर सकता हूं। मुझे लगता है कि मैं बस ऐसा नहीं कर सकता।

उत्तर

3

अद्यतन: ठीक है, मैंने पाया है कि मुझे एक कामकाजी समाधान माना जाता है। यह महत्वपूर्ण बिंदु से संबंधित है जो मल्टीकास्ट समूह में शामिल हो रहा है।

{ok, Socket} = gen_udp:open(Port=5353, [binary, {active, false}, {reuseaddr, true}, 
             {ip, Addr}, {add_membership, {Addr, IAddr}}]). 
  1. प: बहुस्त्र्पीय समूह (जैसे {224, 0, 0, 251}
  2. IAddr एक स्थानीय आईपी इंटरफेस है (उदाहरण के लिएडिफ़ॉल्ट {0,0,0,0})

(बेशक उपयोग कर सकते हैं, यह सुनिश्चित करें कि आप डीएनएस डेमॉन कि संघर्ष में प्रवेश कर सकते हैं) नहीं चल रहे हैं

0

आप एक सॉकेट खोलने का प्रयास करते हैं जो पहले से ही खुला है? क्या आप और प्राप्त करने के लिए एक ही सॉकेट का उपयोग नहीं कर सकते?

+0

मुझे ऐसा नहीं लगता क्योंकि मुझे भेजने के लिए {प्रसारण, सत्य} विकल्प पारित करने की आवश्यकता है। –

+0

{प्रसारण, सत्य/गलत} को इनसेट के साथ बदलने के लिए संभव नहीं है: setopts/2 जब आप कोई संदेश भेज रहे हों तो? – emil

+0

मैं इसे किसी भी सेट के साथ एक संदेश अवधि भेजने के लिए नहीं मिल सकता है या नहीं। –

1

पर्याप्त प्रतिनिधि जवाब देने के लिए नहीं है एमिल के पद के तहत {प्रसारण, सत्य} चर्चा के लिए, क्षमा करें।

SO_BROADCAST सॉकेट ध्वज (जिसे मैं मानता हूं कि मानचित्र) सेट या प्रेषण (एक प्रसारण पता) विफल होना चाहिए। यह उन कार्यक्रमों के साथ दुरुपयोग या त्रुटियों को रोकने के लिए एक सुरक्षा पकड़ है जो प्रसारण करने का इरादा नहीं रखते थे। अन्यथा सुरक्षित कार्यक्रमों को खुद को प्रसारण पते की जांच करने की कोशिश करनी होगी।

SO_BROADCAST सक्षम करने से आपको गैर-प्रसारण पैकेट भेजने से नहीं रोकता है। (फिर से, एर्लंग की चीजें मानते हैं कि सीधे सेटॉकॉप्स पर नक्शे हैं; मुझे एर्लांग नहीं पता, बस नेटवर्किंग!)

आप यह देखने के लिए स्ट्र्रेस का प्रयास करना चाहेंगे कि वास्तव में कौन सी सिस्टम कॉल होती है। सॉकेट() के लिए देखो, और फिर उस फ़ाइल वर्णनकर्ता के साथ क्या होता है।

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