public static Tuple <int, EndPoint> ReceiveMessage(ISocket socket, Buffer buffer, SocketCommunicationTypes type = SocketCommunicationTypes.Blocking, MessageThreadCallback callback = null) { if (type == SocketCommunicationTypes.Blocking) { switch (socket.GetSocket().ProtocolType) { case ProtocolType.Tcp: return(Tuple.Create(socket.GetSocket().Receive(Buffer.GetBufferRef(buffer)), socket.GetSocket().RemoteEndPoint)); case ProtocolType.Udp: EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); return(Tuple.Create(socket.GetSocket().ReceiveFrom(Buffer.GetBufferRef(buffer), ref remoteEndPoint), remoteEndPoint)); default: throw new InvalidOperationException("Socket must be of type TCP or UDP."); } } if (callback == null) { throw new ArgumentNullException(string.Format("{0}=null; You must provide a valid callback when using the NonBlocking type", "callback")); } new Thread(() => MessageReceiveThread(socket, buffer, callback)).Start(); return(Tuple.Create(-1, new IPEndPoint(-1, -1) as EndPoint)); //Return negative 1 as 0 bytes received is valid and we want an invalid value }
public static Tuple<int, EndPoint> ReceiveMessage(ISocket socket, Buffer buffer, SocketCommunicationTypes type = SocketCommunicationTypes.Blocking, MessageThreadCallback callback = null) { if (type == SocketCommunicationTypes.Blocking) { switch (socket.GetSocket().ProtocolType) { case ProtocolType.Tcp: return Tuple.Create(socket.GetSocket().Receive(Buffer.GetBufferRef(buffer)), socket.GetSocket().RemoteEndPoint); case ProtocolType.Udp: EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); return Tuple.Create(socket.GetSocket().ReceiveFrom(Buffer.GetBufferRef(buffer), ref remoteEndPoint), remoteEndPoint); default: throw new ConstraintException("Socket must be of type TCP or UDP."); } } if (callback == null) throw new ArgumentNullException(string.Format("{0}=null; You must provide a valid callback when using the NonBlocking type", "callback")); new Thread(() => MessageReceiveThread(socket, buffer, callback)).Start(); return Tuple.Create(-1, new IPEndPoint(-1, -1) as EndPoint); //Return negative 1 as 0 bytes received is valid and we want an invalid value }
private static void MessageReceiveThread(ISocket socket, Buffer buffer, MessageThreadCallback callback) { int bytes; switch (socket.GetProtocolType()) { case ProtocolType.Tcp: bytes = socket.GetSocket().Receive(Buffer.GetBufferRef(buffer)); callback(bytes); break; case ProtocolType.Udp: EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); bytes = socket.GetSocket().ReceiveFrom(Buffer.GetBufferRef(buffer), ref remoteEndPoint); callback(bytes, remoteEndPoint); break; default: callback(-1); break; } }