我目前有一個.NET程序啓動到服務器的連接。有時我需要調用一個特殊的非託管C++代碼,它使用到服務器的連接。將套接字從.NET傳遞到非託管C++代碼
如何在非託管C++代碼中傳遞和使用來自.NET的套接字連接?
在此先感謝!
我目前有一個.NET程序啓動到服務器的連接。有時我需要調用一個特殊的非託管C++代碼,它使用到服務器的連接。將套接字從.NET傳遞到非託管C++代碼
如何在非託管C++代碼中傳遞和使用來自.NET的套接字連接?
在此先感謝!
Socket
類具有Handle
屬性,可以使用該屬性。
我懷疑這是否會工作,但我能得到它,沒有任何煩憂在所有的工作。
首先,我做了一個非託管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 – NKCSS 2011-04-13 16:25:34
Socket
含義System::Net::Sockets::Socket
?如果是這樣,將Socket::Handle
傳遞給非託管代碼。
我認爲這不支持開箱即用。我能想象的唯一事情是,如果C++應用程序啓動了該進程,它將能夠讀取.NET應用程序的內存,但這是先進的。 – NKCSS 2011-04-13 08:12:11
可能有其他方法來做到這一點。你能否提供一個委託/函數指針給非託管代碼,然後將數據發送到.Net代碼中的套接字上? – Nick 2011-04-13 08:16:41
那麼,尼克,如何做到這一點? – Trogvar 2011-04-13 18:23:40