public void Write(string msg) { string nmsg = string.Format("{0:D6}", msg.Length) + msg; //string nmsg = msg; _buffer.Clear(); _buffer = new SockBuffer(nmsg.Length); _buffer.Encode(nmsg); _buffer.OriginalData = nmsg; try { _clientsock.BeginSend(_buffer.BufferByte, 0, _buffer.BufferByte.Length, SocketFlags.None, HandleSend, null); } catch (Exception ex) { Console.WriteLine("Exception encountered while attempting to send data to client - " + ex.Message); signal_close.Set(); } if (WaitHandle.WaitAny(new WaitHandle[] { signal_write, signal_close }) == 1) { _clientsock.Shutdown(SocketShutdown.Both); _clientsock.Close(); return; } // reset signal write to false (deactivate event) signal_write.Reset(); }
public SocketClient(Socket s, int request_size, string log = "") { _clientsock = s; _address = ((IPEndPoint)_clientsock.RemoteEndPoint).Address.ToString(); _thread = new Thread(ManageSocket); _connected = true; _request_size = request_size; _req_buffer = new SockBuffer(_request_size); signal_close = new ManualResetEvent(false); signal_read = new ManualResetEvent(false); signal_write = new ManualResetEvent(false); if (string.IsNullOrWhiteSpace(log)) { log = Directory.GetCurrentDirectory(); } this._logPath = log + "\\" + DateTime.Now.ToString("yyyyMMdd") + "_client_" + _address.Replace('.', '_').Replace(":", "_") + ".log"; ILogger logger = new FileLogger(_logPath); _callbacks = new KICallback(logger); this.ConnectedEvent += _callbacks.OnConnect; this.DisconnectedEvent += _callbacks.OnDisconnect; this.SendEvent += _callbacks.OnSend; this.ReceivedEvent += _callbacks.OnReceive; // raise the connected event ConnectedEvent(_clientsock, new IPCConnectedEventArgs(_clientsock, _address, _logPath)); }
// BeginRead callback private void HandleReceive(IAsyncResult ar) { int numBytes = 0; _buffer = null; try { // end read returns number of bytes read numBytes = _clientsock.EndReceive(ar); if (numBytes > 0 && numBytes == _request_size) { int req_size = -1; if (!int.TryParse(_req_buffer.Decode(numBytes), out req_size)) { throw new Exception("Client request is corrupted"); } if (req_size > 0) { _buffer = new SockBuffer(req_size); int num_bytes_request = 0; int time_out = 0; // 15 seconds while (_clientsock.Available < req_size) { if (time_out >= 15000) { throw new Exception("The timeout period elapsed while waiting for the client to finish sending data - the client has either disconnected or failed to send a complete message"); } ; Thread.Sleep(50); time_out += 50; } num_bytes_request += _clientsock.Receive(_buffer.BufferByte, 0, _buffer.Size, SocketFlags.None); } } else if (numBytes > 0 && numBytes < _request_size) { // drop this received data, it is probably garbage } else { throw new Exception("Server did not receive any data from client"); } } catch (Exception ex) { _ex = ex; } if (_ex != null) { Console.WriteLine("Error encountered during reading client data: " + _ex.Message); DisconnectedEvent?.Invoke(this, new IPCConnectedEventArgs(_clientsock, _address, _logPath)); // raise disconnected event _connected = false; } else if (_buffer != null) { ReceivedEvent?.Invoke(this, new IPCReceivedEventArgs(_clientsock, _buffer.Decode(_buffer.Size))); // raise received event } signal_read.Set(); //return ar; }