【问题标题】:Pass socket from .NET to unmanaged C++ code将套接字从 .NET 传递到非托管 C++ 代码
【发布时间】:2011-08-04 12:11:20
【问题描述】:

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

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

提前致谢!

【问题讨论】:

  • 我不认为这是开箱即用的支持。我唯一能想象的是,如果 C++ 应用程序启动该进程,它将能够读取 .NET 应用程序的内存,但这是高级领域。
  • 可能还有其他方法可以做到这一点。您能否为非托管代码提供一个委托/函数指针,然后将数据发送到 .Net 代码中的套接字?

标签: c# .net c++ sockets marshalling


【解决方案1】:

Socket 的意思是System::Net::Sockets::Socket?如果是这样,请将Socket::Handle 传递给非托管代码。

【讨论】:

  • 请注意,当 Socket 类被释放时,套接字将被销毁。
【解决方案2】:

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,就是下一个sn-p的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();
        }
    }
}

【讨论】:

  • 我不认为这是可能的......非常酷和很好的测试工作。 +1
猜你喜欢
  • 2013-03-06
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
相关资源
最近更新 更多