void OnReceive(IAsyncResult ar) { SocketAngent client = ar.AsyncState as SocketAngent; SocketEntity socketEnt = client.socket; Socket socket = socketEnt.socket; try { int BytesRead = socket.EndReceive(ar); //if (BytesRead == 0) // return; int count = 0; if (BytesRead <= 0) { socket.BeginDisconnect(true, new AsyncCallback(this.OnDisconnect), client); return; } socketEnt.buffer.writePosition = socketEnt.buffer.writePosition + BytesRead; while (true) { if (socketEnt.buffer.Read(socketEnt.countBytes, 0, sizeof(int))) { count = System.BitConverter.ToInt32(socketEnt.countBytes, 0); count = BinaryStream.ntohl(count); if (socketEnt.buffer.validDataLength >= count) { if (socketEnt.buffer.Pop(socketEnt.recvPacket, 0, count)) { MemoryStream read_stream = new MemoryStream(socketEnt.recvPacket, sizeof(int), count - sizeof(int)); this.OnReceive(read_stream.ToArray(), socketEnt); } else { break; } } else { break; } } else { break; } } if (socketEnt.buffer.writeLength <= 0) { return; } socket.BeginReceive(socketEnt.buffer.buffer, socketEnt.buffer.writePosition, socketEnt.buffer.writeLength, 0, new AsyncCallback(this.OnReceive), client); } catch (SocketException) { this.OnDisconnect(ar); } }
public void update() { if (eventList.Count > 0) { handle.WaitOne(); SocketEvent e = eventList.Dequeue(); SocketEntity a = clientList.Dequeue(); SocketAngent angent = a.angent; handle.Set(); angent.dispatchEvent(e); } }