private void handleConnection(object so) { string logPrefix = ""; try { Socket s = (Socket)so; string endpoint = s.RemoteEndPoint.ToString(); allEndpoints.Add(endpoint); logPrefix = " < " + endpoint + " > "; log(logPrefix + "Socket accepted."); string st = string.Empty; string _ep = s.RemoteEndPoint.ToString(); if (object.Equals(null, outQueueRoot[endpoint])) { outQueueRoot[endpoint] = new ArrayList(); } s.ReceiveBufferSize = 1000000; long packageLength = 0; byte[] mainBuffer = new byte[0]; byte[] tempBuffer = new byte[0]; while (!shutDownListener) { checkInSortQueue(); //send an event if there are any if (((ArrayList)outQueueRoot[endpoint]).Count > 0) { Event ev = (Event)((ArrayList)outQueueRoot[endpoint])[0]; ((ArrayList)outQueueRoot[endpoint]).RemoveAt(0); ev._WhenSent = Time.Now; byte[] ba = prepOutgoingEvent(ev); if (!s.Connected) { outQueueRoot[endpoint] = null; log("Client Disconnected"); allEndpoints.Remove(endpoint); break; } s.Send(ba, ba.Length, SocketFlags.None); } //read some data if there is any if (s.Available > 0) { byte[] roundBuffer = new byte[32768]; //32k chunks int bytesReadThisRound = s.Receive(roundBuffer); tempBuffer = new byte[mainBuffer.Length]; Buffer.BlockCopy(mainBuffer, 0, tempBuffer, 0, mainBuffer.Length); mainBuffer = new byte[bytesReadThisRound + tempBuffer.Length]; Buffer.BlockCopy(tempBuffer, 0, mainBuffer, 0, tempBuffer.Length); Buffer.BlockCopy(roundBuffer, 0, mainBuffer, tempBuffer.Length, bytesReadThisRound); } //retrieve preamble if needed if (packageLength == 0 && mainBuffer.Length >= 8) { byte[] header = new byte[8]; Buffer.BlockCopy(mainBuffer, 0, header, 0, 8); packageLength = BitConverter.ToInt64(header, 0) + 8; } //derive an event if there are any if (packageLength != 0 && mainBuffer.Length >= packageLength) { byte[] packageCrypt = new byte[packageLength - 8]; Buffer.BlockCopy(mainBuffer, 8, packageCrypt, 0, (int)packageLength - 8); tempBuffer = new byte[mainBuffer.Length - packageLength]; Buffer.BlockCopy(mainBuffer, (int)packageLength, tempBuffer, 0, mainBuffer.Length - (int)packageLength); mainBuffer = new byte[tempBuffer.Length]; Buffer.BlockCopy(tempBuffer, 0, mainBuffer, 0, tempBuffer.Length); packageLength = 0; byte[] packageClear = Encryption2.Decrypt(packageCrypt, Config.rawKey); Event ev = Event.FromBytes(packageClear); ev._WhenRcvd = Time.Now; ev._Endpoint = endpoint; receiveEvent(ev); } //limit CPU usage Thread.Sleep(100); } } catch (Exception ex) { log(logPrefix + ex.Message); } }
public void connect(string host, string port) { bool x = false; try { disconnect(); client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); client.Connect(host, int.Parse(port)); client.ReceiveBufferSize = 1000000; long packageLength = 0; byte[] mainBuffer = new byte[0]; byte[] tempBuffer = new byte[0]; byte[] roundBuffer = new byte[32768]; //32k chunks Thread.Sleep(500); if (connected) { connectCompleted(host, port); x = true; } while (connected) { checkInSortQueue(); //send an event if there are any if (outQueueRoot.Count > 0) { Event ev = (Event)outQueueRoot[0]; ev._WhenSent = Time.Now; byte[] ba = prepOutgoingEvent(ev); outQueueRoot.RemoveAt(0); client.Send(ba, ba.Length, SocketFlags.None); } //read some data if there is any if (client.Available > 0) { int bytesReadThisRound = client.Receive(roundBuffer); tempBuffer = new byte[mainBuffer.Length]; Buffer.BlockCopy(mainBuffer, 0, tempBuffer, 0, mainBuffer.Length); mainBuffer = new byte[bytesReadThisRound + tempBuffer.Length]; Buffer.BlockCopy(tempBuffer, 0, mainBuffer, 0, tempBuffer.Length); Buffer.BlockCopy(roundBuffer, 0, mainBuffer, tempBuffer.Length, bytesReadThisRound); } //retrieve preamble if needed if (packageLength == 0 && mainBuffer.Length >= 8) { byte[] header = new byte[8]; Buffer.BlockCopy(mainBuffer, 0, header, 0, 8); packageLength = BitConverter.ToInt64(header, 0) + 8; } //derive an event if there are any if (packageLength != 0 && mainBuffer.Length >= packageLength) { byte[] packageCrypt = new byte[packageLength - 8]; Buffer.BlockCopy(mainBuffer, 8, packageCrypt, 0, (int)packageLength - 8); tempBuffer = new byte[mainBuffer.Length - packageLength]; Buffer.BlockCopy(mainBuffer, (int)packageLength, tempBuffer, 0, mainBuffer.Length - (int)packageLength); mainBuffer = new byte[tempBuffer.Length]; Buffer.BlockCopy(tempBuffer, 0, mainBuffer, 0, tempBuffer.Length); packageLength = 0; byte[] packageClear = Encryption2.Decrypt(packageCrypt, Config.rawKey); Event ev = Event.FromBytes(packageClear); ev._WhenRcvd = Time.Now; receiveEvent(ev); } //limit CPU usage Thread.Sleep(100); } } catch (Exception ex) { log(ex.Message); } finally { Thread.Sleep(500); if (!connected && x) { _onDisconnected(); } } }