예제 #1
0
        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
        }
예제 #2
0
 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
 }
예제 #3
0
        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;
            }
        }
예제 #4
0
 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;
     }
 }