public void connect_complete(UDTSOCKET u) { UdtSocketInternal s = locate(u); if (null == s) { throw new UdtException(5, 4, 0); } // copy address information of local node // the local port must be correctly assigned BEFORE CUDT.connect(), // otherwise if connect() fails, the multiplexer cannot be located by garbage collection and will cause leak s.m_pUDT.m_pSndQueue.m_pChannel.getSockAddr(ref s.m_pSelfAddr); ConvertIPAddress.ToUintArray(s.m_pSelfAddr.Address, ref s.m_pUDT.m_piSelfIP); s.m_Status = UDTSTATUS.CONNECTED; }
public int newConnection(UDTSOCKET listen, IPEndPoint peer, Handshake hs) { UdtSocketInternal ns = null; UdtSocketInternal ls = locate(listen); if (null == ls) { return(-1); } // if this connection has already been processed if (null != (ns = locate(peer, hs.m_iID, hs.m_iISN))) { if (ns.m_pUDT.m_bBroken) { // last connection from the "peer" address has been broken ns.m_Status = UDTSTATUS.CLOSED; ns.m_TimeStamp = Timer.getTime(); lock (ls.m_AcceptLock) { ls.m_pQueuedSockets.Remove(ns.m_SocketID); ls.m_pAcceptSockets.Remove(ns.m_SocketID); } } else { // connection already exist, this is a repeated connection request // respond with existing HS information hs.m_iISN = ns.m_pUDT.m_iISN; hs.m_iMSS = ns.m_pUDT.m_iMSS; hs.m_iFlightFlagSize = ns.m_pUDT.m_iFlightFlagSize; hs.m_iReqType = -1; hs.m_iID = ns.m_SocketID; return(0); //except for this situation a new connection should be started } } // exceeding backlog, refuse the connection request if (ls.m_pQueuedSockets.Count >= ls.m_uiBackLog) { return(-1); } ns = new UdtSocketInternal(); ns.m_pUDT = new UDT(ls.m_pUDT); ns.m_pSelfAddr = new IPEndPoint(IPAddress.Any, 0); ns.m_pPeerAddr = peer; lock (m_IDLock) { ns.m_SocketID = --m_SocketID; } ns.m_ListenSocket = listen; ns.m_iIPversion = ls.m_iIPversion; ns.m_pUDT.m_SocketID = ns.m_SocketID; ns.m_PeerID = hs.m_iID; ns.m_iISN = hs.m_iISN; int error = 0; try { // bind to the same addr of listening socket ns.m_pUDT.open(); updateMux(ns, ls); ns.m_pUDT.connect(peer, hs); } catch (Exception e) { error = 1; goto ERR_ROLLBACK; } ns.m_Status = UDTSTATUS.CONNECTED; // copy address information of local node ns.m_pUDT.m_pSndQueue.m_pChannel.getSockAddr(ref ns.m_pSelfAddr); ConvertIPAddress.ToUintArray(ns.m_pSelfAddr.Address, ref ns.m_pUDT.m_piSelfIP); // protect the m_Sockets structure. lock (m_ControlLock) { m_Sockets[ns.m_SocketID] = ns; HashSet <int> sockets; if (!m_PeerRec.TryGetValue((ns.m_PeerID << 30) + ns.m_iISN, out sockets)) { sockets = new HashSet <int>(); m_PeerRec.Add((ns.m_PeerID << 30) + ns.m_iISN, sockets); } sockets.Add(ns.m_SocketID); } lock (ls.m_AcceptLock) { ls.m_pQueuedSockets.Add(ns.m_SocketID); } // acknowledge users waiting for new connections on the listening socket //m_EPoll.update_events(listen, ls.m_pUDT.m_sPollID, UDT_EPOLL_IN, true); Timer.triggerEvent(); ERR_ROLLBACK: if (error > 0) { ns.m_pUDT.close(); ns.m_Status = UDTSTATUS.CLOSED; ns.m_TimeStamp = Timer.getTime(); return(-1); } // wake up a waiting accept() call ls.m_AcceptCond.Set(); return(1); }
public double m_dCWnd; // congestion window size, congestion control public InfoBlock(IPAddress address) { m_iIPversion = address.AddressFamily; ConvertIPAddress.ToUintArray(address, ref m_piIP); }