private void DoCheckRead(Socket s, MessageDecoder decoder) { if (s != null) { while (run && socket.Available > 0) { int bytesRead = 0; bytesRead = socket.Receive(read_buffer); decoder.Decode(read_buffer, bytesRead); if (run && (bytesRead < read_buffer.Length || decoder.Received.Count >= MAX_RECEIVED_BEFORE_CALLBACK)) { ArrayList received = decoder.Received; Message [] array = (Message [])received.ToArray(typeof(Message)); received.Clear(); if (run && messagesCallback != null) { messagesCallback(array, this, messagesState); } break; } } } }
private void ProcessSocket() { MessageEncoder encoder = new MessageEncoder(); MessageDecoder decoder = new MessageDecoder(); ArrayList list = new ArrayList(); list.Add(socket); while (run) { ArrayList checkRead = null; ArrayList checkWrite = null; ArrayList checkError = null; checkRead = (ArrayList)list.Clone(); checkError = (ArrayList)list.Clone(); lock (sendQueue) { if (sendQueue.Count > 0 || write_buffer != null) { checkWrite = (ArrayList)list.Clone(); } } Socket.Select(checkRead, checkWrite, checkError, 500000); if (checkRead != null && checkRead.Count > 0) { Socket s = (Socket)checkRead[0]; if (s.Available == 0) { throw new Exception("Remote side disconnected"); } DoCheckRead(s, decoder); } if (checkWrite != null && checkWrite.Count > 0) { Socket s = (Socket)checkWrite[0]; DoCheckWrite(s, encoder); } } }