2011-04-13 18 views
5

से सॉकेट पास करें मेरे पास वर्तमान में एक .NET प्रोग्राम है जो सर्वर से कनेक्शन शुरू करता है। कभी-कभी मुझे एक विशेष अप्रबंधित सी ++ कोड कॉल करने की आवश्यकता होती है, जो सर्वर से कनेक्शन का उपयोग करता है।.NET से अप्रबंधित सी ++ कोड

अप्रबंधित सी ++ कोड में .NET से सॉकेट कनेक्शन कैसे पास करें और उपयोग करें?

अग्रिम धन्यवाद!

+0

मुझे नहीं लगता कि यह बॉक्स से बाहर समर्थित है। एकमात्र चीज जिसे मैं कल्पना कर सकता हूं वह यह है कि यदि सी ++ एप्लिकेशन ने प्रक्रिया शुरू की है, तो यह .NET ऐप की स्मृति को पढ़ने में सक्षम होगा, लेकिन यह उन्नत टेरेस्ट्री है। – NKCSS

+0

ऐसा करने के अन्य तरीके हो सकते हैं। क्या आप अप्रबंधित कोड को एक प्रतिनिधि/फ़ंक्शन पॉइंटर प्रदान कर सकते हैं जो तब नेट कोड पर डेटा को सॉकेट पर भेजता है? – Nick

+0

तो, निक, यह कैसे करें? – Trogvar

उत्तर

7

Socket कक्षा में Handle संपत्ति है, जिसका उपयोग किया जा सकता है।

Socket.Handle @ MSDN

मैं के बारे में है कि क्या यह काम करेगा उलझन में था, लेकिन मैं इसे सभी में कोई उपद्रव के साथ काम करने के लिए सक्षम था।

प्रारंभ करने के लिए, मैंने एक एकल फ़ंक्शन को निर्यात करने के लिए एक अप्रबंधित सी ++ डीएल बनाया जो सॉकेट के साथ कुछ कर सकता है। यहां बनाया गया फ़ंक्शन है।

#include <WinSock.h> 

// This is an example of an exported function. 
extern "C" __declspec(dllexport) void __stdcall DoStuffWithSocket(DWORD sock) 
{ 
    const char *data = "woot\r\n"; 
    send((SOCKET)sock, data, strlen(data), 0); 
} 

परियोजना UnmanagedSocketHandler.dll नाम के एक dll, जो पुस्तकालय पी में उल्लेख किया है आउटपुट/अगले स्निपेट में हस्ताक्षर आह्वान।

यहां एक फ़ंक्शन को सर्वर के रूप में कॉल करने के लिए एक त्वरित और गंदा सी # कंसोल ऐप है।

using System.Net; 
using System.Net.Sockets; 
using System.Runtime.InteropServices; 

namespace SocketHandleShareTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      IPEndPoint ep = new IPEndPoint(IPAddress.Any, 5353); 
      Socket sListen = new Socket(AddressFamily.InterNetwork, 
             SocketType.Stream, ProtocolType.Tcp); 
      sListen.Bind(ep); 
      sListen.Listen(10); 
      Socket sClient = sListen.Accept(); 
      Console.WriteLine("DoStuffWithSocket() enter"); 
      Console.ReadLine(); 
      DoStuffWithSocket(sClient.Handle); 
      Console.WriteLine("DoStuffWithSocket() exit"); 
      Console.ReadLine(); 
      sClient.Close(); 
      sListen.Close(); 
      Console.WriteLine("Done."); 
      Console.ReadLine(); 
     } 

     [DllImport("UnmanagedSocketHandler.dll")] 
     static extern void DoStuffWithSocket(IntPtr sock); 
    } 
}  

अंतिम, सर्वर से बात करने के लिए एक त्वरित और गंदे सी # क्लाइंट ऐप। मैं यह क्यों काम करता है पर कोई दस्तावेज नहीं ढूंढ पाया, लेकिन यह काम करता है। मैं सॉकेट के साथ क्या करने की कोशिश करता हूं इसके बारे में सावधान रहूंगा।

using System.Net; 
using System.Net.Sockets; 

namespace SocketHandleShareTestClient 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      byte[] buf = new byte[40]; 
      Socket s = new Socket(AddressFamily.InterNetwork, 
            SocketType.Stream, ProtocolType.IP); 
      s.Connect("localhost", 5353); 
      int len = s.Receive(buf); 
      Console.WriteLine("{0} bytes read.", len); 
      if (len > 0) 
      { 
       string data = Encoding.ASCII.GetString(buf, 0, len); 
       Console.WriteLine(data); 
      } 
      s.Close(); 
      Console.ReadLine(); 
     } 
    } 
} 
+1

मुझे नहीं लगता था कि यह संभव था ... इसका परीक्षण करने के लिए बहुत अच्छा और अच्छा काम। +1 – NKCSS

2

Socket अर्थ System::Net::Sockets::Socket? यदि ऐसा है, तो अप्रबंधित कोड पर Socket::Handle पास करें।

+0

ध्यान दें कि सॉकेट क्लास का निपटारा होने पर सॉकेट नष्ट हो जाएगा। – jgauffin

+0

सही, या अंतिम रूप दिया गया। कोई उम्मीद कर सकता है कि अप्रबंधित कार्य तुल्यकालिक है ... – ildjarn

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