gpt4 book ai didi

c# - 将套接字从 .NET 传递到非托管 C++ 代码

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:20:06 27 4
gpt4 key购买 nike

我目前有一个 .NET 程序启动与服务器的连接。有时我需要调用一个特殊的非托管 C++ 代码,它使用到服务器的连接。

如何在非托管 C++ 代码中传递和使用来自 .NET 的套接字连接?

提前致谢!

最佳答案

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

关于c# - 将套接字从 .NET 传递到非托管 C++ 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5646171/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com