private void PushMessageToUser(MessageTypes type, TCPServerClientInfo clientInfo, User user, TCPServer server, string message = "") { Message msg = new Message(type, user, message); TCPServerInteractEventArgs args = new TCPServerInteractEventArgs(msg, clientInfo, false, false); server.Send(args); }
private void Logout(TCPServerClientInfo clientInfo) { lock (this.locker) { this.LoggedUsers.Remove(clientInfo); } }
private void PushDataToUser(MessageTypes type, TCPServerClientInfo clientInfo, User user, TCPServer server, byte[] binaryData = null) { Message msg = new Message(type, user, null, binaryData); TCPServerInteractEventArgs args = new TCPServerInteractEventArgs(msg, clientInfo, false, false); server.Send(args); }
public TCPServerInteractEventArgs(object message, TCPServerClientInfo clientInfo, bool keepAlive = true, bool callback = true) { this.Object = message; this.KeepAlive = keepAlive; this.CallBack = callback; this.ClientInfo = clientInfo; }
private TCPServerClientInfo AddSocket(Socket socket) { int threadId = Thread.CurrentThread.ManagedThreadId; TCPServerClientInfo info = new TCPServerClientInfo(); info.Socket = socket; info.Id = this.Counter; this.Counter++; if (!socket.Connected) { info.Port = this.EndPoint.Port.ToString(); info.IpAddress = this.EndPoint.Address.ToString(); } else { string endPoint = socket.RemoteEndPoint.ToString(); string expressionIpAddress = @"(\d)+\.(\d)+\.(\d)+\.(\d)+"; string expressionPort = @"(\d)+$"; Regex regex = new Regex(expressionIpAddress); info.IpAddress = regex.Match(endPoint).Value; regex = new Regex(expressionPort); info.Port = regex.Match(endPoint).Value; this.WatchDog(TCPServerMessages.ClientConnected, info); } this.Sockets.Add(threadId, info); return(info); }
private void Connect(IAsyncResult state) { Socket baseSocket = state.AsyncState as Socket; Socket client = null; try { client = baseSocket.EndAccept(state); TCPServerClientInfo clientInfo = this.AddSocket(client); this.NewThread(); this.Interact(clientInfo); } catch (TCPServerInteractException ex) { this.WatchDog(TCPServerMessages.ClientFail, this.Sockets[Thread.CurrentThread.ManagedThreadId]); } catch (ObjectDisposedException ex) { this.WatchDog(TCPServerMessages.EndAccepting); this.CheckIfStopped(); } catch (Exception ex) { this.WatchDog(TCPServerMessages.AcceptFail); } finally { if (client != null) { client.Shutdown(SocketShutdown.Both); this.RemoveSocket(); client.Close(); } } }
private User Login(TCPServerClientInfo clientInfo, User user) { lock (this.locker) { this.LoggedUsers.Add(clientInfo, user); } return(user); }
private void Interact(TCPServerClientInfo clientInfo) { Socket client = clientInfo.Socket; bool keepAlive; try { do { byte[] bytes = new byte[this.BufferSize]; int bytesCount = client.Receive(bytes); TCPServerInteractEventArgs args = new TCPServerInteractEventArgs(); args.Bytes = bytes; args.BytesCount = bytesCount; args.ClientInfo = clientInfo; if (this.DataType != null) { MethodInfo method = typeof(TCPServer).GetMethod("GetObject", BindingFlags.Instance | BindingFlags.NonPublic); try { method.MakeGenericMethod(this.DataType).Invoke(this, new object[] { args }); } catch (Exception ex) { this.WatchDog(TCPServerMessages.ParseFail, this.Sockets[Thread.CurrentThread.ManagedThreadId]); } } if (this.ServerInteractEvent != null) { this.ServerInteractEvent(this, args); } if (args.CallBack) { if (this.DataType != null) { this.SetObject(args); } bytesCount = client.Send(args.Bytes); } keepAlive = args.KeepAlive; } while (keepAlive); } catch (Exception ex) { throw new TCPServerInteractException(); } }
private void WatchDog(TCPServerMessages state, TCPServerClientInfo client = null) { if (state == TCPServerMessages.Undefined) { return; } string message = String.Empty; if (state == TCPServerMessages.Initialized) { message = "Initialized"; } else if (state == TCPServerMessages.Started) { message = "Server started at " + this.EndPoint.Address.ToString() + " : " + this.EndPoint.Port.ToString(); } else if (state == TCPServerMessages.Stopped) { message = "Stopped"; } else if (state == TCPServerMessages.AddressFail) { message = "Ip address fail"; } else if (state == TCPServerMessages.EndPointFail) { message = "Endpoint fail"; } else if (state == TCPServerMessages.StartFail) { message = "Start fail"; } else if (state == TCPServerMessages.NotInitialized) { message = "Not initialized"; } else if (state == TCPServerMessages.AcceptFail) { message = "Accept fail"; } else if (state == TCPServerMessages.ClientConnected) { message = "Client " + client.Id.ToString() + " connected"; } else if (state == TCPServerMessages.ClientDisconnected) { message = "Client " + client.Id.ToString() + " disconnected"; } else if (state == TCPServerMessages.ClientFail) { message = "Client " + client.Id.ToString() + " fail"; } else if (state == TCPServerMessages.AlreadyInitialized) { message = "Server already initialized"; } else if (state == TCPServerMessages.EndAccepting) { message = "End accepting sockets"; } else if (state == TCPServerMessages.NoHandler) { message = "No server handler assigned"; } else if (state == TCPServerMessages.ParseFail) { message = "Data parsing fail, client " + client.Id.ToString(); } else if (state == TCPServerMessages.SocketLimit) { message = "Socket limit reached"; } string fullMessage = DateTime.Now.ToUniversalTime() + " : " + message; this.MessageLog.Add(fullMessage); TCPServerMessageEventArgs argument = new TCPServerMessageEventArgs(); argument.Message = fullMessage; argument.MessageType = state; argument.ClientInfo = client; if (this.ServerMessageEvent != null) { this.ServerMessageEvent(this, argument); } }
public TCPServerMessageEventArgs(TCPServerMessages messageType, string message, TCPServerClientInfo clientInfo) { this.Message = message; this.ClientInfo = clientInfo; this.MessageType = messageType; }