private void OnShimReady(object sender, NetMQSocketEventArgs e)
        {
            string command = e.Socket.ReceiveString();

            if (command == WSSocket.BindCommand)
            {
                string address = e.Socket.ReceiveString();

                int errorCode = 0;

                try
                {
                    m_stream.Bind(address.Replace("ws://", "tcp://"));
                }
                catch (NetMQException ex)
                {
                    errorCode = (int)ex.ErrorCode;
                }

                byte[] bytes = BitConverter.GetBytes(errorCode);
                e.Socket.Send(bytes);
            }
            else if (command == ActorKnownMessages.END_PIPE)
            {
                m_poller.Stop(false);
            }
        }
Beispiel #2
0
        private void ConnectAsInitiatorDirect()
        {
            // Start a listening socket and populate the DCI structure with
            // network information
            IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 0);

            _listener = new StreamSocket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            _listener.Bind(ipep);

            RendezvousData rd = new RendezvousData();

            Port = (ushort)((IPEndPoint)_listener.LocalEndPoint).Port;
            _listener.Listen(1);
            _listener.BeginAccept(new AsyncCallback(AcceptConnection), rd);

            // Send the "send file" request on SNAC(04,06):02
            parent.Messages.RequestDirectConnectionInvite(this);
        }
Beispiel #3
0
        public void Run(PairSocket shim)
        {
            string shimAdd = $"inproc://wsrouter-{Id}";

            Monitor.Enter(this);
            try
            {
                isRuning = true;
                shim.SignalOK();

                shim.ReceiveReady += OnShimReady;

                MessagesPipe = new PairSocket();
                MessagesPipe.Connect(shimAdd);
                MessagesPipe.ReceiveReady += OnMessagePipeReady;

                Stream = new StreamSocket();
                Stream.Bind(Address);
                Stream.ReceiveReady += OnStreamReady;

                Poller = new NetMQPoller
                {
                    MessagesPipe,
                    shim,
                    Stream
                };
                MessagesPipe.SignalOK();
                Poller.Run();
                shim.Dispose();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
            finally
            {
                Monitor.Exit(this);
            }
        }
Beispiel #4
0
        public void Do()
        {
            // we are using dealer here, but we can use router as well, we just have to manager
            // SecureChannel for each identity
            using (var socket = new StreamSocket())
            {
                socket.Bind("tcp://*:9696");

                using (SecureChannel secureChannel = SecureChannel.CreateServerSecureChannel(m_configuration))
                {
                    // we need to set X509Certificate with a private key for the server
                    X509Certificate2 certificate = new X509Certificate2(
                        System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "server.pfx"), "1234");
                    secureChannel.Certificate = certificate;

                    List <NetMQMessage> outgoingMessages = new List <NetMQMessage>();
                    bool done = false;
                    // waiting for message from client
                    byte[] cache = null;
                    do
                    {
                        outgoingMessages.Clear();
                        NetMQMessage incomingMessage = socket.ReceiveMultipartMessage();
                        if (cache == null || cache.Length <= 0)
                        {
                            cache = incomingMessage.Last.Buffer;
                        }
                        else
                        {
                            cache = CombineV2(cache, incomingMessage.Last.Buffer);
                        }
                        //SplitInMessage
                        int offset;
                        List <NetMQMessage> sslMessages;
                        secureChannel.ResolveRecordLayer(cache, out offset, out sslMessages);
                        if (cache.Length == offset)
                        {
                            cache = null;
                        }
                        else if (cache.Length > offset)
                        {
                            byte[] temp = new byte[cache.Length - offset];
                            Buffer.BlockCopy(cache, offset, temp, 0, temp.Length);
                            cache = temp;
                        }
                        foreach (var sslMessage in sslMessages)
                        {
                            // calling ProcessMessage until ProcessMessage return true
                            // and the SecureChannel is ready to encrypt and decrypt messages
                            done = secureChannel.ProcessMessage(sslMessage, outgoingMessages);
                            SendMessages(socket, outgoingMessages);
                        }
                    } while (!done);
                    SendMessages(socket, outgoingMessages);
                    outgoingMessages.Clear();
                    cache = null;
                    while (true)
                    {
                        // this message is now encrypted
                        NetMQMessage cipherMessage = socket.ReceiveMultipartMessage();
                        if (cache == null || cache.Length <= 0)
                        {
                            cache = cipherMessage.Last.Buffer;
                        }
                        else
                        {
                            cache = CombineV2(cache, cipherMessage.Last.Buffer);
                        }
                        int offset2;
                        List <NetMQMessage> sslMessages2;
                        secureChannel.ResolveRecordLayer(cache, out offset2, out sslMessages2);
                        if (cache.Length == offset2)
                        {
                            cache = null;
                        }
                        else if (offset2 == 0)
                        {
                            //长度不够,等下一次读取在解析
                            continue;
                        }
                        else if (cache.Length > offset2)
                        {
                            byte[] temp = new byte[cache.Length - offset2];
                            Buffer.BlockCopy(cache, offset2, temp, 0, temp.Length);
                            cache = temp;
                        }
                        if (sslMessages2.Count <= 0)
                        {
                            continue;
                        }
                        // decrypting the message
                        NetMQMessage plainMessage = secureChannel.DecryptApplicationMessage(sslMessages2[0]);
                        System.Console.WriteLine(plainMessage.First.ConvertToString());
                        plainMessage = new NetMQMessage();
                        plainMessage.Append("00000021<Root>TestResp</Root>");

                        socket.SendMoreFrame(socket.Options.Identity);
                        socket.SendFrame(secureChannel.EncryptApplicationMessage(plainMessage)[0].Buffer);
                    }
                    // encrypting the message and sending it over the socket
                }
            }
        }
Beispiel #5
0
        protected override void Run()
        {
            ForceDotNet.Force();


            client = new StreamSocket();
            //client.Options.RouterRawSocket = true;
            client.Bind("tcp://localhost:5555");
            Debug.Log("Communication started");

            long timeSinceLastMessage = 0;


            while (true)
            {
                List <byte[]> message         = null;
                bool          receivedmessage = false;
                receivedmessage = client.TryReceiveMultipartBytes(ref message, 2);

                if (receivedmessage)
                {
                    timeSinceLastMessage = 0;

                    Debug.Log("Message Received");
                    Char[] charconvert = System.Text.Encoding.UTF8.GetChars(message[1], 0, message[1].Length);
                    if (string.Join("", charconvert) == "PointData Finished" || System.Text.Encoding.UTF8.GetString(message[1], 0, message[1].Length) == "PointData Finished")
                    {
                        Debug.Log("Transfer finished");
                        break;
                    }

                    Debug.Log("Recieved bytes " + string.Join("", message[1]));

                    float convert = BitConverter.ToSingle(message[1], 0);
                    Debug.Log("Recieved : " + convert);

                    Array.Reverse(message[1]);

                    float convert2 = BitConverter.ToSingle(message[1], 0);
                    Debug.Log("Reversed : " + convert2);
                }


                //Char[] convert2 = System.Text.Encoding.ASCII.GetChars(message, 0, message.Length);
                //Debug.Log("Recieved : " + string.Join("",convert2));



                timeSinceLastMessage++;


                if (timeSinceLastMessage > timeLimit)
                {
                    Debug.Log("Timeout");

                    break;
                }
            }

            client.Disconnect("tcp://localhost:5555");

            Debug.Log("Stopping Connection");

            client.Dispose();
            NetMQConfig.Cleanup();
            isRunning = false;
        }