2011-04-13 74 views
5

我目前有一個.NET程序啓動到服務器的連接。有時我需要調用一個特殊的非託管C++代碼,它使用到服務器的連接。將套接字從.NET傳遞到非託管C++代碼

如何在非託管C++代碼中傳遞和使用來自.NET的套接字連接?

在此先感謝!

+0

我認爲這不支持開箱即用。我能想象的唯一事情是,如果C++應用程序啓動了該進程,它將能夠讀取.NET應用程序的內存,但這是先進的。 – NKCSS 2011-04-13 08:12:11

+0

可能有其他方法來做到這一點。你能否提供一個委託/函數指針給非託管代碼,然後將數據發送到.Net代碼中的套接字上? – Nick 2011-04-13 08:16:41

+0

那麼,尼克,如何做到這一點? – Trogvar 2011-04-13 18:23:40

回答

7

Socket類具有Handle屬性,可以使用該屬性。

Socket.Handle @ MSDN

我懷疑這是否會工作,但我能得到它,沒有任何煩憂在所有的工作。

首先,我做了一個非託管C++ dll來導出一個可以對套接字執行某些操作的函數。這是我創建的功能。

#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,它是在P中提到的庫在接下來的片段/調用簽名。

下面是一個快速和骯髒的C#控制檯應用程序來調用該函數作爲服務器。

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); 
    } 
}  

最後,一個快速骯髒的C#客戶端應用程序與服務器交談。我無法找到任何文件,爲什麼這個工程,但它的作品。我會對你試圖用套接字進行警惕。

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 2011-04-13 16:25:34

2

Socket含義System::Net::Sockets::Socket?如果是這樣,將Socket::Handle傳遞給非託管代碼。

+0

請注意,當套接字類get被處置時套接字將被銷燬。 – jgauffin 2011-04-13 08:32:06

+0

對,或者最終確定。人們可以希望非託管的功能是同步的... – ildjarn 2011-04-13 08:33:24

相關問題