Передача сокета из .NET в неуправляемый код C ++ - PullRequest
5 голосов
/ 13 апреля 2011

В настоящее время у меня есть программа .NET, инициирующая соединение с сервером. Иногда мне нужно вызвать специальный неуправляемый код C ++, который использует соединение с сервером.

Как передать и использовать сокетное соединение из .NET в неуправляемом коде C ++?

Заранее спасибо!

Ответы [ 2 ]

7 голосов
/ 13 апреля 2011

Класс 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);
}

Проект выводит dll с именем UnmanagedSocketHandler.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();
        }
    }
}
2 голосов
/ 13 апреля 2011

Socket означает System::Net::Sockets::Socket?Если это так, передайте Socket::Handle неуправляемому коду.

...