从.net传递套接字到非托管c++代码
本文关键字:c++ 代码 net 套接字 | 更新日期: 2023-09-27 17:50:16
我目前有一个。net程序启动到服务器的连接。有时我需要调用一个特殊的非托管c++代码,它使用到服务器的连接。
如何在非托管c++代码中从。net传递和使用套接字连接?
提前感谢!
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/Invoke签名中提到的库。
这是一个快速而肮脏的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();
}
}
}
Socket
意思是System::Net::Sockets::Socket
?如果是,将Socket::Handle
传递给非托管代码。