private void OnListen() { ModuleProc PROC = new ModuleProc(this.DYN_MODULE_NAME, "OnListen"); try { while (!_executorService.WaitForShutdown(100)) { try { IAsyncResult acceptAsync = _socket.BeginAccept(null, null); int waitIndex = _executorService.WaitAny(acceptAsync.AsyncWaitHandle, -1); if (waitIndex == 0) { break; } Socket clientSocket = _socket.EndAccept(acceptAsync); INetSocketHandler client = new TcpSocketServerClient(clientSocket); int hashcode = client.GetHashCode(); if (_hasThreads) { if (_totalThreads != -1) { int threadIndex = (hashcode % _totalThreads); ClientsInfo ci = null; if (_clients.ContainsKey(threadIndex)) { ci = _clients[threadIndex]; } else { ci = new ClientsInfo(threadIndex); _clients.Add(threadIndex, ci); _pool.QueueWorkerItem(ci); } Log.InfoV(PROC, "Client [{0}] was connected at Thread {1:D}", client.ToString(), threadIndex); ci.AddClient(client); } else { } } this.OnClientConnected(client); } catch (Exception ex) { Log.Exception(PROC, ex); } } } catch (Exception ex) { Log.Exception(PROC, ex); } }
public void CopyFrom(ClientsInfo c) { for (int i = 0; i < MaxClients; ++i) { areConnected[i] = c.areConnected[i]; userIds[i] = c.userIds[i]; userNames[i] = c.userNames[i]; } }
public void ProcessServerInfoPacket(byte[] packet) { Profiler.BeginSample("ProcessServerInfoPacket"); var clients = new ClientsInfo(); if (ReadClientsPacket(packet, clients.areConnected, clients.userIds, clients.userNames)) { Debug.Log("Received server info:"); clients.Print(); if (state == Connecting) //client searches for its own user id in the first server info. this is how the client knows what client slot it has been assigned. { int id = clients.FindClientByUserId(userId); if (id == Nobody) { Debug.Log("error: Could not find our user id " + userId + " in server info? Something is horribly wrong!"); DisconnectFromServer(); return; } ConnectToServer(id); } for (int i = 0; i < MaxClients; ++i) //track remote clients joining and leaving by detecting edge triggers on the server info. { if (i == clientId) { continue; } if (!info.areConnected[i] && clients.areConnected[i]) { OnRemoteClientConnected(i, clients.userIds[i], clients.userNames[i]); } else if (info.areConnected[i] && !clients.areConnected[i]) { OnRemoteClientDisconnected(i, info.userIds[i], info.userNames[i]); } } info.CopyFrom(clients); //copy across the packet server info to our current server info } Profiler.EndSample(); }
/// <summary> /// takes messages from the shared queue, converts them to C# classes, and sends them to up /// берет сообщения из общей очереди, конвертирует их в классы C# и отправляет на верх /// </summary> public void Converter() { while (true) { try { if (_isDisposed) { return; } if (!_newMessage.IsEmpty) { string data; if (_newMessage.TryDequeue(out data)) { if (data.StartsWith("<pits>") || data.StartsWith("<sec_info")) { continue; } if (data.StartsWith("<server_status")) { ServerStatus status = Deserialize <ServerStatus>(data); if (status.Connected == "true") { IsConnected = true; Connected?.Invoke(); } else if (status.Connected == "false") { IsConnected = false; Disconnected?.Invoke(); } else if (status.Connected == "error") { SendLogMessage(status.Text, LogMessageType.Error); } } else if (data.StartsWith("<securities>")) { var securities = _deserializer.Deserialize <List <Security> >(new RestResponse() { Content = data }); UpdatePairs?.Invoke(securities); } else if (data.StartsWith("<united_portfolio")) { UnitedPortfolio unitedPortfolio = Deserialize <UnitedPortfolio>(data); UpdatePortfolio?.Invoke(unitedPortfolio); } else if (data.StartsWith("<positions")) { var positions = Deserialize <TransaqPositions>(data); UpdatePositions?.Invoke(positions); } else if (data.StartsWith("<clientlimits")) { var limits = Deserialize <Clientlimits>(data); UpdateMonoPortfolio?.Invoke(limits); } else if (data.StartsWith("<client")) { var clientInfo = _deserializer.Deserialize <Client>(new RestResponse() { Content = data }); ClientsInfo?.Invoke(clientInfo); } else if (data.StartsWith("<alltrades>")) { var allTrades = _deserializer.Deserialize <List <Trade> >(new RestResponse() { Content = data }); NewTradesEvent?.Invoke(allTrades); } else if (data.StartsWith("<quotes>")) { var quotes = _deserializer.Deserialize <List <Quote> >(new RestResponse() { Content = data }); UpdateMarketDepth?.Invoke(quotes); } else if (data.StartsWith("<orders>")) { var orders = _deserializer.Deserialize <List <Order> >(new RestResponse() { Content = data }); MyOrderEvent?.Invoke(orders); } else if (data.StartsWith("<trades>")) { var myTrades = _deserializer.Deserialize <List <Trade> >(new RestResponse() { Content = data }); MyTradeEvent?.Invoke(myTrades); } else if (data.StartsWith("<candles")) { Candles newCandles = Deserialize <Candles>(data); NewCandles?.Invoke(newCandles); } else if (data.StartsWith("<messages>")) { if (data.Contains("Время действия Вашего пароля истекло")) { NeedChangePassword?.Invoke(); } } } } } catch (Exception exception) { SendLogMessage(exception.ToString(), LogMessageType.Error); } Thread.Sleep(1); } }
private void OnListen() { ModuleProc PROC = new ModuleProc(this.DYN_MODULE_NAME, "OnListen"); try { while (!_executorService.WaitForShutdown(100)) { try { IAsyncResult acceptAsync = _socket.BeginAccept(null, null); int waitIndex = _executorService.WaitAny(acceptAsync.AsyncWaitHandle, -1); if (waitIndex == 0) break; Socket clientSocket = _socket.EndAccept(acceptAsync); INetSocketHandler client = new TcpSocketServerClient(clientSocket); int hashcode = client.GetHashCode(); if (_hasThreads) { if (_totalThreads != -1) { int threadIndex = (hashcode % _totalThreads); ClientsInfo ci = null; if (_clients.ContainsKey(threadIndex)) { ci = _clients[threadIndex]; } else { ci = new ClientsInfo(threadIndex); _clients.Add(threadIndex, ci); _pool.QueueWorkerItem(ci); } Log.InfoV(PROC, "Client [{0}] was connected at Thread {1:D}", client.ToString(), threadIndex); ci.AddClient(client); } else { } } this.OnClientConnected(client); } catch (Exception ex) { Log.Exception(PROC, ex); } } } catch (Exception ex) { Log.Exception(PROC, ex); } }