微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将套接字从.NET传递到不受管理的C ++代码

如何解决将套接字从.NET传递到不受管理的C ++代码

| 我目前有一个.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,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,len);
                Console.WriteLine(data);
            }
            s.Close();
            Console.ReadLine();
        }
    }
}
    ,
Socket
System::Net::Sockets::Socket
?如果是这样,请将
Socket::Handle
传递给非托管代码。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。