コード例 #1
0
        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();
        }
コード例 #2
0
        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));
        }
コード例 #3
0
        // 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;
        }