2010-02-03 11 views
9

पर एक सक्रिय वायरलेस कार्ड और एक क्रॉसओवर केबल के साथ एक लैन-पोर्ट के साथ एक ही कंप्यूटर पर एक ही मशीन चलाने के लिए एक मशीन पर लगाया जाना चाहिए, हमें एक यूडीपी भेजने की जरूरत है अन्य कंप्यूटर पर लैन तार पर मल्टीकास्ट। सी # सॉकेट का उपयोग करते हुए, विंडोज हर बार डब्लूएलएएन एडाप्टर पर संदेश को रूट करने का प्रयास करता है।निर्दिष्ट करना कि नेटवर्क इंटरफ़ेस को यूटीपी मल्टीकास्ट को .NET

क्या यूडीपी मल्टीकास्ट भेजने के लिए नेटवर्क इंटरफ़ेस निर्दिष्ट करने का कोई तरीका है?

+1

क्या आपको कोई समाधान मिला? मेरी भी यही समस्या है। क्या एमएसडीएन पर आलेख आपकी समस्या का समाधान करता है? – Gobliins

+0

मेरे लिए यह – Gobliins

+0

@Gobliins भी मेरे लिए काम नहीं किया था:/कोई समाधान? – J4N

उत्तर

5

आप शायद SocketOptionName.MulticastInterface देख रहे हैं। Here एमएसडीएन पर एक लेख है जो आपकी मदद कर सकता है।

अन्यथा यदि आप अपनी स्थानीय रूटिंग तालिका को मल्टीकास्ट पते से मेल खाने वाली सटीक प्रविष्टि और सही इंटरफ़ेस को इंगित करने के लिए अपडेट करते हैं तो इसे केवल काम करना चाहिए।

10

निकोलई के उत्तर के रूप में सिर्फ उत्तर: KB318911 के साथ समस्या एक गंदे चाल है जिसे उपयोगकर्ता को आवश्यक एडाप्टर इंडेक्स प्रदान करना होगा। देख कैसे इस एडाप्टर सूचकांक को पुनः प्राप्त करने जब मैं इस तरह के नुस्खा पता लगा:

NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces(); 
foreach (NetworkInterface adapter in nics) 
{ 
    IPInterfaceProperties ip_properties = adapter.GetIPProperties(); 
    if (!adapter.GetIPProperties().MulticastAddresses.Any()) 
    continue; // most of VPN adapters will be skipped 
    if (!adapter.SupportsMulticast) 
    continue; // multicast is meaningless for this type of connection 
    if (OperationalStatus.Up != adapter.OperationalStatus) 
    continue; // this adapter is off or not connected 
    IPv4InterfaceProperties p = adapter.GetIPProperties().GetIPv4Properties(); 
    if (null == p) 
    continue; // IPv4 is not configured on this adapter 

    // now we have adapter index as p.Index, let put it to socket option 
    my_sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, (int)IPAddress.HostToNetworkOrder(p.Index)); 
} 

पूर्ण टिप्पणी http://windowsasusual.blogspot.ru/2013/01/socket-option-multicast-interface.html

+0

पर मल्टीकास्ट पते में शामिल होने के लिए udpclient क्लास (लेकिन सॉकेट के साथ भी संभव है) का उपयोग किया है लोन लिंक [खराब जवाब माना जाता है] (http://stackoverflow.com/faq#deletion) यह अपने आप से व्यर्थ है और ** लक्ष्य संसाधन भविष्य में जीवित रहने की गारंटी नहीं है **। [यह बेहतर होगा] (http://meta.stackexchange.com/q/8259) यहां उत्तर के आवश्यक हिस्सों को शामिल करने के लिए, और संदर्भ के लिए लिंक प्रदान करें। – j0k

+0

Fxied, बहुत बहुत धन्यवाद –

+0

धन्यवाद; 'adapter.SupportsMulticast' के बारे में जानने के लिए उपयोगी है। नोट: 'p.Index' कभी-कभी स्थानीय लूपबैक के लिए '-1' होता है, जब यह' 1' होना चाहिए। और 'p.Index' फेंकता है अगर एडाप्टर में कोई अनुक्रमणिका नहीं है। –

2

में आप क्या कर रहे पर निर्भर करता है, वहाँ एक Win32 विधि है कि मदद कर सकता है है। यह किसी दिए गए आईपी पते के लिए सबसे अच्छा इंटरफ़ेस वापस कर देगा। डिफ़ॉल्ट (0.0.0.0) है, जो आम तौर पर आप बहुस्त्र्पीय के लिए क्या चाहते है पाने के लिए, यह बहुत आसान है:

पी/आह्वान हस्ताक्षर:

[DllImport("iphlpapi.dll", CharSet = CharSet.Auto)] 
private static extern int GetBestInterface(UInt32 DestAddr, out UInt32 BestIfIndex); 

फिर कहीं और:

// There could be multiple adapters, get the default one 
uint index = 0; 
GetBestInterface(0, out index); 
var ifaceIndex = (int)index; 

var client = new UdpClient(); 
client.Client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, (int)IPAddress.HostToNetworkOrder(ifaceIndex)); 

var localEndpoint = new IPEndPoint(IPAddress.Any, <port>); 
client.Client.Bind(localEndpoint); 

var multicastAddress = IPAddress.Parse("<group IP>"); 
var multOpt = new MulticastOption(multicastAddress, ifaceIndex); 
client.Client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, multOpt); 

var broadcastEndpoint = new IPEndPoint(IPAddress.Parse("<group IP>"), <port>); 
byte[] buffer = ... 
await client.SendAsync(buffer, buffer.Length, broadcastEp).ConfigureAwait(false); 
संबंधित मुद्दे