Esempio n. 1
0
        internal override void Bind(EndPoint localEndPoint)
        {
            if (localEndPoint == null)
            {
                throw new ArgumentNullException("localEndPoint");
            }

            IPEndPoint ep = localEndPoint as IPEndPoint;

            if (ep == null)
            {
                // Illegal argument
                throw new SocketException(SocketErrors.WSAEINVAL);
            }

            // Make sure we're in the ReadyState
            UdpConnectionContract /*.Imp*/ conn = (UdpConnectionContract)m_Conn.Acquire();

            try {
                if (!conn.InState(UdpConnectionContract.State.ReadyState /*.Value*/))
                {
                    throw new SocketException(BAD_SOCKET_STATE_ERR);
                }

                conn.BindLocalEndPoint(ep.Address.m_addr,
                                       unchecked ((ushort)ep.Port));
                m_LocalEndPoint = new IPEndPoint(ep.Address, ep.Port);
            }
            finally {
                m_Conn.Release(conn);
            }
        }
Esempio n. 2
0
        internal override int ReceiveFrom(byte[]      buffer,
                                          int offset,
                                          int size,
                                          SocketFlags socketFlags,
                                          ref EndPoint remoteEP)
        {
            ValidateBufferOffsets(buffer, offset, size);
            if (socketFlags != SocketFlags.None)
            {
                // Invalid flags for this operation
                throw new SocketException(SocketErrors.WSAEINVAL);
            }

            UdpConnectionContract /*.Imp*/ conn = (UdpConnectionContract)m_Conn.Acquire();

            try {
                if (conn.InState(UdpConnectionContract.State.Closed /*.Value*/))
                {
                    throw new SocketException(BAD_SOCKET_STATE_ERR);
                }

                Bytes  rdata = conn.Read();
                uint   addr  = 0;
                ushort port  = 0;
                remoteEP = new IPEndPoint(new IPAddress(addr), port);
                int amount = Math.Min(rdata.Length, size);
                Bitter.ToByteArray(rdata, 0, amount, buffer, offset);
                return(amount);
            }
            finally {
                m_Conn.Release(conn);
            }
        }
Esempio n. 3
0
        internal override int Send(Bytes data,
                                   SocketFlags socketFlags)
        {
            int byteCount = data.Length;

            if (socketFlags != SocketFlags.None)
            {
                // Invalid flags for this operation
                throw new SocketException(SocketErrors.WSAEINVAL);
            }

            UdpConnectionContract /*.Imp*/ conn = (UdpConnectionContract)m_Conn.Acquire();

            try {
                if (!conn.InState(UdpConnectionContract.State.Connected /*.Value*/))
                {
                    throw new SocketException(BAD_SOCKET_STATE_ERR);
                }

                conn.Write(data); // Give away data

                return(byteCount);
            }
            finally {
                m_Conn.Release(conn);
            }
        }
Esempio n. 4
0
        internal override void Connect(EndPoint remoteEndPoint)
        {
            if (remoteEndPoint == null)
            {
                throw new ArgumentNullException("remoteEP");
            }

            IPEndPoint ep = remoteEndPoint as IPEndPoint;

            if (ep == null)
            {
                // Illegal argument
                throw new SocketException(SocketErrors.WSAEINVAL);
            }

            UdpConnectionContract /*.Imp*/ conn = (UdpConnectionContract)m_Conn.Acquire();

            if (!conn.InState(UdpConnectionContract.State.ReadyState /*.Value*/) &&
                !conn.InState(UdpConnectionContract.State.LocallyBound /*.Value*/))
            {
                // Need to be in the start state to issue a Connect
                throw new SocketException(BAD_SOCKET_STATE_ERR);
            }

            try {
                uint   localIP   = 0;
                ushort localPort = 0;

                if (m_LocalEndPoint != null)
                {
                    if (m_LocalEndPoint.Address != IPAddress.Any)
                    {
                        localIP = (uint)m_LocalEndPoint.Address.m_addr;
                    }

                    if (m_LocalEndPoint.Port != 0)
                    {
                        localPort = unchecked ((ushort)m_LocalEndPoint.Port);
                    }
                }

                if ((localIP != 0) && (localPort != 0))
                {
                    conn.Connect(new IPv4(localIP), localPort,
                                 new IPv4((uint)ep.Address.m_addr),
                                 unchecked ((ushort)ep.Port));
                }
                else
                {
                    conn.ConnectWithAnyLocalEndPoint(
                        new IPv4((uint)ep.Address.m_addr),
                        unchecked ((ushort)ep.Port));
                }

                m_RemoteEndPoint = ep;
            }
            finally {
                m_Conn.Release(conn);
            }
        }
Esempio n. 5
0
        internal override void Close()
        {
            UdpConnectionContract /*.Imp*/ conn = (UdpConnectionContract)m_Conn.Acquire();

            try {
                if (!conn.InState(UdpConnectionContract.State.Closed /*.Value*/))
                {
                    conn.Close();
                }
            }
            finally {
                m_Conn.Release(conn);
            }
        }
Esempio n. 6
0
        internal override bool Poll(int microSeconds, SelectMode mode)
        {
            int millis = 0;

            if (microSeconds < 0)
            {
                millis = Int32.MaxValue;
            }
            else
            {
                millis = microSeconds / 1000;
            }

            UdpConnectionContract /*.Imp*/ conn = (UdpConnectionContract)m_Conn.Acquire();

            try {
                if (conn.InState(UdpConnectionContract.State.Closed /*.Value*/))
                {
                    throw new ObjectDisposedException("socket");
                }

                switch (mode)
                {
                case SelectMode.SelectRead:
                    return(PollSelectRead(conn, millis));

                //break;
                case SelectMode.SelectWrite:
                    return(PollSelectWrite(conn, millis));

                //break;
                case SelectMode.SelectError:
                    return(false);

                // We don't support any of the requisite operations
                //break;
                default:
                    throw new NotSupportedException();
                }
            }
            finally {
                m_Conn.Release(conn);
            }
        }
Esempio n. 7
0
        internal override int SendTo(byte[]     buffer,
                                     int offset,
                                     int size,
                                     SocketFlags socketFlags,
                                     EndPoint remoteEP)
        {
            ValidateBufferOffsets(buffer, offset, size);

            if (socketFlags != SocketFlags.None)
            {
                // Invalid flags for this operation
                throw new SocketException(SocketErrors.WSAEINVAL);
            }

            IPEndPoint ep = remoteEP as IPEndPoint;

            if (ep == null)
            {
                throw new SocketException(SocketErrors.WSAEINVAL);
            }

            UdpConnectionContract /*.Imp*/ conn = (UdpConnectionContract)m_Conn.Acquire();

            try {
                if (conn.InState(UdpConnectionContract.State.Closed /*.Value*/))
                {
                    throw new SocketException(BAD_SOCKET_STATE_ERR);
                }

                // Copy the data to write into an ExHeap vector and send it
                Bytes dataToWrite = Bitter.FromByteArray(buffer, offset, size);

                conn.WriteTo((uint)ep.Address.m_addr,
                             unchecked ((ushort)ep.Port),
                             dataToWrite);
                // no longer own dataToWrite!

                return(size);
            }
            finally {
                m_Conn.Release(conn);
            }
        }
Esempio n. 8
0
        // ================ Private Methods ================

        private void Initialize(UdpConnectionContract /*.Imp*/ conn)
        {
            m_Conn = new TRef/*<UdpConnectionContract.Imp>*/ (conn);
        }
Esempio n. 9
0
 private bool PollSelectWrite(UdpConnectionContract /*.Imp*/ conn,
                              int millis)
 {
     return(conn.PollSelectWrite(millis));
 }
Esempio n. 10
0
 internal override void Dispose()
 {
     UdpConnectionContract /*.Imp*/ conn = (UdpConnectionContract)m_Conn.Acquire();
     //delete conn;
     // Leak our TRef!
 }