From 1e9a66cbaae97759c5c4e936664b5cc7a4feca89 Mon Sep 17 00:00:00 2001 From: Tedd Hansen Date: Sat, 12 Jan 2008 00:48:58 +0000 Subject: ScriptServer communication protocol (v1), primitive RPC-like TCP client/server --- .../Region/ScriptEngine/Common/TRPC/TCPClient.cs | 109 +++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 OpenSim/Region/ScriptEngine/Common/TRPC/TCPClient.cs (limited to 'OpenSim/Region/ScriptEngine/Common/TRPC/TCPClient.cs') diff --git a/OpenSim/Region/ScriptEngine/Common/TRPC/TCPClient.cs b/OpenSim/Region/ScriptEngine/Common/TRPC/TCPClient.cs new file mode 100644 index 0000000..3230614 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Common/TRPC/TCPClient.cs @@ -0,0 +1,109 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Net; +using System.Net.Sockets; +using System.Text; + +namespace OpenSim.Region.ScriptEngine.Common.TRPC +{ + public class TCPClient: TCPCommon.ClientInterface + { + + public TCPClient() + { + } + private readonly Dictionary Clients = new Dictionary(); + private int ClientCount = 0; + + + public event TCPCommon.ClientConnectedDelegate ClientConnected; + public event TCPCommon.DataReceivedDelegate DataReceived; + public event TCPCommon.DataSentDelegate DataSent; + public event TCPCommon.CloseDelegate Close; + public event TCPCommon.ConnectErrorDelegate ConnectError; + + + /// + /// Creates client connection + /// + public void Connect(string RemoteHost, int RemotePort) + { + Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(RemoteHost), RemotePort); + newsock.BeginConnect(ipe, new AsyncCallback(asyncConnected), newsock); + + + } + + public void Disconnect(int ID) + { + Clients[ID].Disconnect(); + } + + void asyncConnected(IAsyncResult iar) + { + Socket client = (Socket)iar.AsyncState; + try + { + client.EndConnect(iar); + + + int id = ClientCount++; + TCPSocket S = new TCPSocket(id, client); + + // Add to dictionary + Clients.Add(id, S); + + // Add event handlers + S.Close += new TCPSocket.CloseDelegate(S_Close); + S.DataReceived += new TCPSocket.DataReceivedDelegate(S_DataReceived); + S.DataSent += new TCPSocket.DataSentDelegate(S_DataSent); + + // Start it + S.Start(); + + Debug.WriteLine("Connection established: " + client.RemoteEndPoint.ToString()); + + // Fire Connected-event + if (ClientConnected != null) + ClientConnected(id, client.RemoteEndPoint); + + } + catch (SocketException sex) + { + if (ConnectError != null) + ConnectError(sex.Message); + } + } + + + + + void S_DataSent(int ID, int length) + { + if (DataSent != null) + DataSent(ID, length); + } + + void S_DataReceived(int ID, byte[] data, int offset, int length) + { + if (DataReceived != null) + DataReceived(ID, data, offset, length); + } + + void S_Close(int ID) + { + if (Close != null) + Close(ID); + Clients.Remove(ID); + } + + public void Send(int clientID, byte[] data, int offset, int len) + { + Clients[clientID].Send(clientID, data, offset, len); + } + + + } +} \ No newline at end of file -- cgit v1.1