From 20fbc943cec5ee13781b8222d643dc73994bf7ce Mon Sep 17 00:00:00 2001 From: "Crom (Thibaut CHARLES)" Date: Tue, 21 Apr 2015 22:47:54 +0200 Subject: [PATCH] Receiving multiple messages on same socket --- TestingAI.d | 6 ++- nwn2ai_onmoduleload/nwn2ai_onmoduleload.cs | 43 +++++++++++----------- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/TestingAI.d b/TestingAI.d index 2df8791..9b2076a 100644 --- a/TestingAI.d +++ b/TestingAI.d @@ -13,8 +13,10 @@ void main() { sock.connect(new InternetAddress("127.0.0.1", 8080)); writeln("Connected"); - auto msg = `{"action":"bind","target":"testnpc"}`; - sock.send(msg.toUTF8); + sock.send(`{"action":"bind","target":"testnpc"}`.toUTF8); writeln("Sent"); Thread.sleep(dur!"seconds"(1)); + sock.send(`{"action":"getenv","target":"testnpc"}`.toUTF8); + writeln("Sent2"); + Thread.sleep(dur!"seconds"(1)); } \ No newline at end of file diff --git a/nwn2ai_onmoduleload/nwn2ai_onmoduleload.cs b/nwn2ai_onmoduleload/nwn2ai_onmoduleload.cs index 795fbac..5997880 100644 --- a/nwn2ai_onmoduleload/nwn2ai_onmoduleload.cs +++ b/nwn2ai_onmoduleload/nwn2ai_onmoduleload.cs @@ -57,7 +57,7 @@ namespace CLRScript debugFile = File.AppendText("nwnx4\\customlog.txt"); Debug("====================================> Start"); - sockBufferIn = new Queue(); + sockBufferIn = new Queue>(); sockClients = new Dictionary(); SocketConfigure(); @@ -83,38 +83,37 @@ namespace CLRScript sockServer.Bind(iep); sockServer.Listen(10); - sockThread = new Thread(new ThreadStart(SocketHandler)); - sockThread.Start(); - } - - void SocketHandler() - { - while(true){ - Debug("Accepting"); - sockServer.BeginAccept(new AsyncCallback(RequestHandler), null); - //Wait for EndAccept? - Thread.Sleep(1000); - } + sockServer.BeginAccept(new AsyncCallback(RequestHandler), null); } void RequestHandler(IAsyncResult state) { Socket sockClient = sockServer.EndAccept(state); - byte[] rawData = new byte[1024]; - sockClient.Receive(rawData, rawData.Length, 0); + sockServer.BeginAccept(new AsyncCallback(RequestHandler), null); + sockClient.Blocking = true; + + while (sockClient.Connected) { + byte[] rawData = new byte[sockClient.Available]; + if (sockClient.Available > 0) { + sockClient.Receive(rawData, rawData.Length, 0); + + string data = Encoding.UTF8.GetString(rawData); + Debug("Queued "+data); + sockBufferIn.Enqueue(new Tuple(data, sockClient)); + } + else + Thread.Sleep(100);//TODO: Find another way than sleeping + + + } - string data = Encoding.UTF8.GetString(rawData); - Debug("Queued "+data); - sockBufferIn.Enqueue(data); } Socket sockServer; - Thread sockThread; - Queue sockBufferIn; + Queue> sockBufferIn;//Request & client - //PNJ tag => Client socket - Dictionary sockClients; + Dictionary sockClients;//PNJ tag => Client socket private void Debug(string msg){ debugFile.WriteLine(DateTime.Now.ToLongTimeString()+": "+msg);