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