मेरे पास आईपीएड्रेस पर बाध्य एक सॉकेट के साथ एक असीमित यूडीपी सर्वर क्लास है। कोई भी, और मैं जानना चाहता हूं कि प्राप्त आईपीएड्रेस किस प्राप्त पैकेट को भेजा गया था (... या प्राप्त हुआ)। ऐसा लगता है कि मैं सिर्फ सॉकेट.लोकलएंडपॉइंट प्रॉपर्टी का उपयोग नहीं कर सकता, क्योंकि यह हमेशा 0.0.0.0 देता है (जो समझ में आता है क्योंकि यह उस के लिए बाध्य है ...)।सी # यूडीपी सॉकेट: रिसीवर पता प्राप्त करें
यहाँ कोड मैं वर्तमान में उपयोग कर रहा हूँ के दिलचस्प भागों हैं: 127.0.0.1:1678 0.0.0.0 करने से
प्राप्त 32 बाइट्स:private Socket udpSock; private byte[] buffer; public void Starter(){ //Setup the socket and message buffer udpSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); udpSock.Bind(new IPEndPoint(IPAddress.Any, 12345)); buffer = new byte[1024]; //Start listening for a new message. EndPoint newClientEP = new IPEndPoint(IPAddress.Any, 0); udpSock.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref newClientEP, DoReceiveFrom, udpSock); } private void DoReceiveFrom(IAsyncResult iar){ //Get the received message. Socket recvSock = (Socket)iar.AsyncState; EndPoint clientEP = new IPEndPoint(IPAddress.Any, 0); int msgLen = recvSock.EndReceiveFrom(iar, ref clientEP); byte[] localMsg = new byte[msgLen]; Array.Copy(buffer, localMsg, msgLen); //Start listening for a new message. EndPoint newClientEP = new IPEndPoint(IPAddress.Any, 0); udpSock.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref newClientEP, DoReceiveFrom, udpSock); //Handle the received message Console.WriteLine("Recieved {0} bytes from {1}:{2} to {3}:{4}", msgLen, ((IPEndPoint)clientEP).Address, ((IPEndPoint)clientEP).Port, ((IPEndPoint)recvSock.LocalEndPoint).Address, ((IPEndPoint)recvSock.LocalEndPoint).Port); //Do other, more interesting, things with the received message. }
जैसा कि बताया जा पहले यह हमेशा की तरह एक लाइन प्रिंट: 12345
और मैं चाहता हूँ यह की तरह कुछ होने के लिए: इस पर किसी भी विचार के लिए, 127.0.0.1:1678 से करने के लिए 127.0.0.1:12345
धन्यवाद
प्राप्त 32 बाइट्स अग्रिम में,! --Adamअद्यतन
ठीक है, मैं एक समाधान पाया है, हालांकि मुझे यह पसंद नहीं है ... असल में, बजाय एक ही UDP सॉकेट IPAddress.Any करने के लिए बाध्य खोलने की है, मैं बनाने के एक प्रत्येक उपलब्ध आईपीएड्रेस के लिए अद्वितीय सॉकेट। ,
public void Starter(){ buffer = new byte[1024]; //create a new socket and start listening on the loopback address. Socket lSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); lSock.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 12345); EndPoint ncEP = new IPEndPoint(IPAddress.Any, 0); lSock.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref ncEP, DoReceiveFrom, lSock); //create a new socket and start listening on each IPAddress in the Dns host. foreach(IPAddress addr in Dns.GetHostEntry(Dns.GetHostName()).AddressList){ if(addr.AddressFamily != AddressFamily.InterNetwork) continue; //Skip all but IPv4 addresses. Socket s = new Socket(addr.AddressFamily, SocketType.Dgram, ProtocolType.Udp); s.Bind(new IPEndPoint(addr, 12345)); EndPoint newClientEP = new IPEndPoint(IPAddress.Any, 0); s.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref newClientEP, DoReceiveFrom, s); } }
इस अवधारणा को, इस कोड को उसी रूप में साथ सबसे बड़ी समस्या यह वर्णन करने के लिए बस है कि प्रत्येक सॉकेट एक ही बफर ... जो आम तौर पर है उपयोग करने के लिए कोशिश कर रहा है: तो, नई स्टार्टर समारोह लगता है कि एक बुरा विचार ...
इसके लिए एक बेहतर समाधान होना चाहिए; मेरा मतलब है, स्रोत और गंतव्य यूडीपी पैकेट हेडर का हिस्सा हैं! ओह ठीक है, मुझे लगता है कि जब तक कुछ बेहतर होता है तब तक मैं इसके साथ जाऊंगा।
अब यह परीक्षण किया गया है और यह काम करता है। यह इस विषय पर कई प्रश्नों का सबसे अच्छा जवाब है। मैं ReceiveMessageFromAsync संस्करण को देखने के लिए उत्सुक हूं लेकिन यदि आप उत्तर नहीं देते हैं तो शायद यह मेरे लिए काम कर सकता है। –
@ स्टीफनकेनेडी: मुझे नहीं लगता कि मेरे पास अब भी उस कोड को ईमानदार होने के लिए है। : पी यह बहुत जटिल नहीं है, हालांकि, आईआईआरसी; बस 'SocketAsyncEventArgs' सेट अप करें, एक हैंडलर को अपने' पूर्ण 'ईवेंट से संलग्न करें, फिर ऑब्जेक्ट को' ReceiveMessageFromAsync' पर पास करें। – cHao
कोई चिंता नहीं। मेरे पास SendToAsync() काम कर रहा है, इसलिए ReceiveMessageFromAsync() tmw :) के साथ एक play हो सकता है। –