diff --git a/TestingAI.d b/TestingAI.d index 8b55357..74bc055 100644 --- a/TestingAI.d +++ b/TestingAI.d @@ -42,5 +42,8 @@ void main() { sock.sendWait(`{"action":"bind","target":"testnpc"}`); writeln(sock.receiveWait); + Thread.sleep(dur!"seconds"(1)); sock.shutdown(SocketShutdown.BOTH); + + 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 cf7f3e7..9243335 100644 --- a/nwn2ai_onmoduleload/nwn2ai_onmoduleload.cs +++ b/nwn2ai_onmoduleload/nwn2ai_onmoduleload.cs @@ -130,30 +130,46 @@ namespace CLRScript void RequestHandler(IAsyncResult state) { Socket sockClient = sockServer.EndAccept(state); - sockServer.BeginAccept(new AsyncCallback(RequestHandler), null); - sockClient.Blocking = true; - while (sockClient.Connected) { + sockClient.Blocking = false; + + try { + while (sockClient.Connected && IsSocketConnected(sockClient)) { + byte[] rawData = new byte[0]; + byte[] buf = new byte[256]; + int recv; + - if (sockClient.Available > 0) { - byte[] rawData = new byte[sockClient.Available]; - sockClient.Receive(rawData, rawData.Length, 0); + while (sockClient.Available>0 && (recv = sockClient.Receive(buf))>0) { + rawData = rawData.Concat(buf.Take(recv)).ToArray(); + Thread.Sleep(10); + } - string data = Encoding.UTF8.GetString(rawData); - Debug("Queued "+data); - sockBufferIn.Enqueue(new Tuple(data, sockClient)); + if (rawData.Length > 0) { + string data = Encoding.UTF8.GetString(rawData); + + Debug("Queued "+data); + sockBufferIn.Enqueue(new Tuple(data, sockClient)); + } + Thread.Sleep(100); } - Thread.Sleep(10); - - + } + catch (Exception e) { + Debug(e.ToString()); } //Remove stored bind + Debug("EXIT"); var sock = sockClients.First(kvp => kvp.Value==sockClient); sockClients.Remove(sock.Key); } + public static bool IsSocketConnected(Socket socket) + { + try { return !(socket.Poll(1, SelectMode.SelectRead) && socket.Available == 0); } + catch (SocketException) { return false; } + } Socket sockServer; Queue> sockBufferIn;//Request & client