// Queue an item for immediate sending on the wire
        // This method is called from the ISenderChannels
        internal void QueueSendMessage(NetOutgoingMessage om, int seqNr)
        {
            m_peer.VerifyNetworkThread();

            int sz = om.GetEncodedSize();

            if (sz > m_currentMTU)
            {
                m_peer.LogWarning("Message larger than MTU! Fragmentation must have failed!");
            }

            if (m_sendBufferWritePtr + sz > m_currentMTU)
            {
                bool connReset;                                                               // TODO: handle connection reset
                NetException.Assert(m_sendBufferWritePtr > 0 && m_sendBufferNumMessages > 0); // or else the message should have been fragmented earlier
                m_peer.SendPacket(m_sendBufferWritePtr, m_remoteEndpoint, m_sendBufferNumMessages, out connReset);
                m_statistics.PacketSent(m_sendBufferWritePtr, m_sendBufferNumMessages);
                m_sendBufferWritePtr    = 0;
                m_sendBufferNumMessages = 0;
            }

            m_sendBufferWritePtr = om.Encode(m_peer.m_sendBuffer, m_sendBufferWritePtr, seqNr);
            m_sendBufferNumMessages++;

            NetException.Assert(m_sendBufferWritePtr > 0, "Encoded zero size message?");
            NetException.Assert(m_sendBufferNumMessages > 0);
        }
Exemple #2
0
        /// <summary>
        /// Add a forwarding rule to the router using UPnP
        /// </summary>
        public bool ForwardPort(int port, string description)
        {
            if (m_serviceUrl == null && !m_discoveryComplete.WaitOne(c_discoveryTimeOutMillis))
            {
                return(false);
            }

            IPAddress mask;
            var       client = NetUtility.GetMyAddress(out mask);

            if (client == null)
            {
                return(false);
            }

            try
            {
                XmlDocument xdoc = SOAPRequest(m_serviceUrl,
                                               "<u:AddPortMapping xmlns:u=\"urn:schemas-upnp-org:service:WANIPConnection:1\">" +
                                               "<NewRemoteHost></NewRemoteHost><NewExternalPort>" + port.ToString() + "</NewExternalPort>" +
                                               "<NewProtocol>" + ProtocolType.Udp.ToString().ToUpper() + "</NewProtocol>" +
                                               "<NewInternalPort>" + port.ToString() + "</NewInternalPort>" +
                                               "<NewInternalClient>" + client.ToString() + "</NewInternalClient>" +
                                               "<NewEnabled>1</NewEnabled>" +
                                               "<NewPortMappingDescription>" + description + "</NewPortMappingDescription>" +
                                               "<NewLeaseDuration>0</NewLeaseDuration>" +
                                               "</u:AddPortMapping>",
                                               "AddPortMapping");

                m_peer.LogDebug("Sent UPnP port forward request");
                System.Threading.Thread.Sleep(50);
            }
            catch (Exception ex)
            {
                m_peer.LogWarning("UPnP port forward failed: " + ex.Message);
                return(false);
            }
            return(true);
        }