public void Send(IMessagePart message, bool correctLength) { List <IOVector> vecs = new List <IOVector> (); int length = 0; //vecs.AddRange (message); foreach (IOVector v in message) { vecs.Add(v); length += v.Length; } IOVector[] iovec = vecs.ToArray(); Trace.WriteLine("Vectors: " + iovec.Length + " Length: " + length); if (length % 4 != 0) { Trace.WriteLine("Error: % 4"); } ushort nBlocks = (ushort)(length / 4); Trace.WriteLine("nBlocks: " + nBlocks); if (correctLength) { unsafe { Request *rq = (Request *)iovec[0].Base; rq->Length = nBlocks; } } Trace.WriteLine("WritePoll: " + sock.Poll(-1, SelectMode.SelectWrite)); VectorIO.Write(fd, iovec); //FallbackWrite (iovec); //queue.Enqueue (message); }
public unsafe void ReadMessage() { byte[] bs = ms.GetBuffer(); //Trace.WriteLine (ms.Length); //TODO: stream ptr might move during reads; temp solution only fixed(byte *bp = bs) { ReadBlocks(1); Request *rq = (Request *)bp; Trace.WriteLine(rq->Opcode); Trace.WriteLine("Length: " + rq->Length); ReadBlocks((int)rq->Length); if (rq->Opcode >= 128) { Trace.WriteLine("Extension Request"); } switch (rq->Opcode) { case 1: //CreateWindow Trace.WriteLine("CreateWindow"); break; case 15: //QueryTree Trace.WriteLine("QueryTree"); break; case 98: //QueryExtension Trace.WriteLine("QueryExtension"); break; } } }