static void makeRpcRequest(uint req_size, req_builder b, resp_builder br, out byte[] result, out uint resultSize) { if (_api == null || !reuse) { init_rpc(); } byte[] req_data; uint real_size; b(req_size, out req_data, out real_size); result = _api.Execute(req_data); resultSize = (uint)result.Length; }
private static void Main(string[] args) { req_builder builder = req_bytes; resp_builder br = resp_bytes; makeRequest call = makePipeRequest; for (int i = 0; i < args.Length; i++) { string o = args[i]; if (o == "-m") { string s = args[i + 1]; makeRequest makeWindowsMessageRequest = null; makeRequest makeSharedMemoryRequest = null; switch (s) { case "pipes": call = makePipeRequest; break; case "messaging": call = makeWindowsMessageRequest; break; case "rpc": call = makeRpcRequest; break; case "wcf": call = makeWcfRequest; break; default: call = makeSharedMemoryRequest; break; } } if (o == "-d") { string s = args[i + 1]; req_builder req_msg = null; builder = s == "bytes" ? req_bytes : (s == "object" ? req_obj : req_msg); resp_builder resp_msg = null; br = s == "bytes" ? resp_bytes : (s == "object" ? resp_obj : resp_msg); } if (o == "-r") { reuse = true; } if (o == "-o") { oneway = true; } } if (reuse) { if (call == makePipeRequest) { while (!WaitNamedPipe(pipe_name, 1)) { } } if (call == makeRpcRequest) { init_rpc(); } if (call == makeWcfRequest) { init_wcf(); } } byte[] req; uint real_size = 0; byte[] response; uint resp_size = 0; if (!oneway) { init_reqs(req_size100, 5000, 10); init_reqs(req_size50, 2500, 10); init_reqs(req_size10, 500, 10); init_reqs(req_size1, 50, 10); init_reqs(req_size0_1, 5, 10); } builder(req_size100, out req, out real_size); for (int i = 0; i < 5; i++) { call(req_size100, builder, br, out response, out resp_size); } var sw = new Reportwatch(); sw.Lang = ReportwatchLangs.Markdown; sw.SetMode("REAL_TIME"); Console.WriteLine("Client started"); var msr100 = "Client process requests ~100kb and gets ~1000kb response of server process"; var msr50 = "Client process requests ~50kb and gets ~500kb response of server process"; var msr10 = "Client process requests ~10kb and gets ~100kb response of server process"; var msr1 = "Client process requests ~1kb and gets ~10kb response of server process"; var msr0_1 = "Client process requests ~0.1kb and gets ~1kb response of server process"; builder(req_size100, out req, out real_size); Console.WriteLine("Request size :" + real_size / kb + " kb"); for (int i = 0; i < 5; i++) { sw.Start(msr100); call(req_size100, builder, br, out response, out resp_size); sw.Stop(msr100); } Console.WriteLine("Response size was :" + resp_size / kb + " kb"); builder(req_size50, out req, out real_size); Console.WriteLine("Request size :" + real_size / kb + " kb"); for (int i = 0; i < 10; i++) { sw.Start(msr50); call(req_size50, builder, br, out response, out resp_size); sw.Stop(msr50); } Console.WriteLine("Response size was :" + resp_size / kb + " kb"); builder(req_size10, out req, out real_size); Console.WriteLine("Message size :" + real_size / kb + " kb"); for (int i = 0; i < 50; i++) { sw.Start(msr10); call(req_size10, builder, br, out response, out resp_size); sw.Stop(msr10); } Console.WriteLine("Response size was :" + resp_size / kb + " kb"); builder(req_size1, out req, out real_size); Console.WriteLine("Message size :" + real_size + " bytes"); for (int i = 0; i < 500; i++) { //Sleep(1); //BUG: sometimes hangs here when pipes used.... sw.Start(msr1); call(req_size1, builder, br, out response, out resp_size); sw.Stop(msr1); } Console.WriteLine("Response size was :" + resp_size / kb + " kb"); builder(req_size0_1, out req, out real_size); Console.WriteLine("Message size :" + real_size + " bytes"); for (int i = 0; i < 1000; i++) {//BUG: server of shared memory crashes if make number of 10000 //Sleep(1); //BUG: sometimes hangs here when pipes used.... sw.Start(msr0_1); call(req_size0_1, builder, br, out response, out resp_size); sw.Stop(msr0_1); } Console.WriteLine("Response size was :" + resp_size + " bytes"); builder(req_size100, out req, out real_size); Console.WriteLine("Request size :" + real_size / kb + " kb"); for (int i = 0; i < 5; i++) { sw.Start(msr100); call(req_size100, builder, br, out response, out resp_size); sw.Stop(msr100); } Console.WriteLine("Response size was :" + resp_size / kb + " kb"); builder(req_size50, out req, out real_size); Console.WriteLine("Request size :" + real_size / kb + " kb"); for (int i = 0; i < 10; i++) { sw.Start(msr50); call(req_size50, builder, br, out response, out resp_size); sw.Stop(msr50); } Console.WriteLine("Response size was :" + resp_size / kb + " kb"); builder(req_size10, out req, out real_size); Console.WriteLine("Message size :" + real_size / kb + " kb"); for (int i = 0; i < 50; i++) { sw.Start(msr10); call(req_size10, builder, br, out response, out resp_size); sw.Stop(msr10); } Console.WriteLine("Response size was :" + resp_size / kb + " kb"); builder(req_size1, out req, out real_size); Console.WriteLine("Message size :" + real_size + " bytes"); for (int i = 0; i < 500; i++) { //Sleep(1); //BUG: sometimes hangs here when pipes used.... sw.Start(msr1); call(req_size1, builder, br, out response, out resp_size); sw.Stop(msr1); } Console.WriteLine("Response size was :" + resp_size / kb + " kb"); builder(req_size0_1, out req, out real_size); Console.WriteLine("Message size :" + real_size + " bytes"); for (int i = 0; i < 1000; i++) {//BUG: server of shared memory crashes if make number of 10000 //Sleep(1); //BUG: sometimes hangs here when pipes used.... sw.Start(msr0_1); call(req_size0_1, builder, br, out response, out resp_size); sw.Stop(msr0_1); } Console.WriteLine("Response size was :" + resp_size + " bytes"); //TODO: make assertion of response sw.Report(msr100); sw.Report(msr50); sw.Report(msr10); sw.Report(msr1); sw.Report(msr0_1); Console.ReadKey(); }
static void makePipeRequest(uint req_size, req_builder b, resp_builder br, out byte[] result, out uint resultSize) { result = null; resultSize = 0; if (!reuse) { hPipe = null; } if (hPipe == null || hPipe.IsInvalid) { while (!WaitNamedPipe(pipe_name, 1)) { } } while (hPipe == null || hPipe.IsInvalid) { hPipe = CreateFile( pipe_name, FileAccess.ReadWrite, 0, IntPtr.Zero, FileMode.Open, FileAttributes.Normal, IntPtr.Zero); if (hPipe.IsInvalid) { break; } } byte[] request_data = null; uint rmessageSize = 0; b(req_size, out request_data, out rmessageSize); //unsafe //{ // byte* rd = (byte*)Marshal.AllocHGlobal((int)rmessageSize); //} byte[] msg = new byte[sizeof(int) + rmessageSize]; Array.Copy(BitConverter.GetBytes((int)rmessageSize), msg, sizeof(int)); Array.Copy(request_data, 0, msg, sizeof(int), request_data.Length);//NOTE: additional copy slows down pipes - can be avoided uint cbWritten = 0; IntPtr o = IntPtr.Zero; var write_marshall = GCHandle.Alloc(msg, GCHandleType.Pinned); WriteFile(hPipe, write_marshall.AddrOfPinnedObject(), sizeof(int) + rmessageSize, out cbWritten, o); write_marshall.Free(); byte[] response = null; int responseSize = 0; if (!oneway) { uint cbRead = 0; var sb = new byte[sizeof(int)]; bool size_was_read = ReadFile(hPipe, sb, sizeof(int), out cbRead, IntPtr.Zero); responseSize = (int)BitConverter.ToUInt32(sb, 0); response = new byte[responseSize]; //if (!rSizeRead) Console.WriteLine( cbRead); //Console.WriteLine( cbRead); //if (GetLastError() == ERROR_MORE_DATA) Console.WriteLine( "MORE DATA"); //var pin_resp = GCHandle.Alloc(response,GCHandleType.Pinned); //var pin_resp_addr = pin_resp.AddrOfPinnedObject(); //bool was_read = Fast.ReadFile(hPipe, pin_resp_addr, (uint)responseSize, out cbRead, IntPtr.Zero); //result = response; //pin_resp.Free(); bool was_read = ReadFile(hPipe, response, (uint)responseSize, out cbRead, IntPtr.Zero); result = response; //Console.WriteLine( cbRead); //if (!rRead) Console.WriteLine( cbRead); //if (GetLastError() == ERROR_MORE_DATA) Console.WriteLine( "MORE DATA"); //Console.WriteLine( rRead); } else { uint cbRead = 0; var got_data = new byte[1]; bool was_read = ReadFile(hPipe, got_data, sizeof(bool), out cbRead, IntPtr.Zero); } if (!reuse) { CloseHandle(hPipe); } if (!oneway) { br((uint)responseSize, response); resultSize = (uint)responseSize; } }
static void makeWcfRequest(uint req_size, req_builder b, resp_builder br, out byte[] result, out uint resultSize) { if (_wcf == null || !reuse) init_wcf(); byte[] req_data; uint real_size; b(req_size, out req_data, out real_size); result = _wcf.Execute(req_data); resultSize = (uint)result.Length; }
static void makePipeRequest(uint req_size, req_builder b, resp_builder br, out byte[] result, out uint resultSize) { result = null; resultSize = 0; if (!reuse) hPipe = null; if (hPipe == null || hPipe.IsInvalid) while (!WaitNamedPipe(pipe_name, 1)) { } while (hPipe == null || hPipe.IsInvalid) { hPipe = CreateFile( pipe_name, FileAccess.ReadWrite, 0, IntPtr.Zero, FileMode.Open, FileAttributes.Normal, IntPtr.Zero); if (hPipe.IsInvalid) break; } byte[] request_data = null; uint rmessageSize = 0; b(req_size, out request_data, out rmessageSize); //unsafe //{ // byte* rd = (byte*)Marshal.AllocHGlobal((int)rmessageSize); //} byte[] msg = new byte[sizeof(int) + rmessageSize]; Array.Copy(BitConverter.GetBytes((int)rmessageSize), msg, sizeof(int)); Array.Copy(request_data, 0, msg, sizeof(int), request_data.Length);//NOTE: additional copy slows down pipes - can be avoided uint cbWritten = 0; IntPtr o = IntPtr.Zero; var write_marshall = GCHandle.Alloc(msg, GCHandleType.Pinned); WriteFile(hPipe, write_marshall.AddrOfPinnedObject(), sizeof(int) + rmessageSize, out cbWritten, o); write_marshall.Free(); byte[] response = null; int responseSize = 0; if (!oneway) { uint cbRead = 0; var sb = new byte[sizeof(int)]; bool size_was_read = ReadFile(hPipe, sb, sizeof(int), out cbRead, IntPtr.Zero); responseSize = (int)BitConverter.ToUInt32(sb, 0); response = new byte[responseSize]; //if (!rSizeRead) Console.WriteLine( cbRead); //Console.WriteLine( cbRead); //if (GetLastError() == ERROR_MORE_DATA) Console.WriteLine( "MORE DATA"); //var pin_resp = GCHandle.Alloc(response,GCHandleType.Pinned); //var pin_resp_addr = pin_resp.AddrOfPinnedObject(); //bool was_read = Fast.ReadFile(hPipe, pin_resp_addr, (uint)responseSize, out cbRead, IntPtr.Zero); //result = response; //pin_resp.Free(); bool was_read = ReadFile(hPipe, response, (uint)responseSize, out cbRead, IntPtr.Zero); result = response; //Console.WriteLine( cbRead); //if (!rRead) Console.WriteLine( cbRead); //if (GetLastError() == ERROR_MORE_DATA) Console.WriteLine( "MORE DATA"); //Console.WriteLine( rRead); } else { uint cbRead = 0; var got_data = new byte[1]; bool was_read = ReadFile(hPipe, got_data, sizeof(bool), out cbRead, IntPtr.Zero); } if (!reuse) CloseHandle(hPipe); if (!oneway) { br((uint)responseSize, response); resultSize = (uint)responseSize; } }