// Functionality: // Read UDT options. // Parameters: // 0) [in] optName: The enum name of a UDT option. // 1) [in] optval: The value to be returned. // 2) [out] optlen: size of "optval". // Returned value: // None. void getOpt(UDTOpt optName, Object optval, int optlen) { CGuard cg = new CGuard(m_ConnectionLock); switch (optName) { case UDT_MSS: *(int*)optval = m_iMSS; optlen = sizeof(int); break; case UDT_SNDSYN: *(bool*)optval = m_bSynSending; optlen = sizeof(bool); break; case UDT_RCVSYN: *(bool*)optval = m_bSynRecving; optlen = sizeof(bool); break; case UDT_CC: if (!m_bOpened) throw new CUDTException(5, 5, 0); *(CCC**)optval = m_pCC; optlen = sizeof(CCC*); break; case UDT_FC: *(int*)optval = m_iFlightFlagSize; optlen = sizeof(int); break; case UDT_SNDBUF: *(int*)optval = m_iSndBufSize * (m_iMSS - 28); optlen = sizeof(int); break; case UDT_RCVBUF: *(int*)optval = m_iRcvBufSize * (m_iMSS - 28); optlen = sizeof(int); break; case UDT_LINGER: if (optlen < (int)(sizeof(linger))) throw new CUDTException(5, 3, 0); *(linger*)optval = m_Linger; optlen = sizeof(linger); break; case UDP_SNDBUF: *(int*)optval = m_iUDPSndBufSize; optlen = sizeof(int); break; case UDP_RCVBUF: *(int*)optval = m_iUDPRcvBufSize; optlen = sizeof(int); break; case UDT_RENDEZVOUS: *(bool *)optval = m_bRendezvous; optlen = sizeof(bool); break; case UDT_SNDTIMEO: *(int*)optval = m_iSndTimeOut; optlen = sizeof(int); break; case UDT_RCVTIMEO: *(int*)optval = m_iRcvTimeOut; optlen = sizeof(int); break; case UDT_REUSEADDR: *(bool *)optval = m_bReuseAddr; optlen = sizeof(bool); break; case UDT_MAXBW: *(Int64*)optval = m_llMaxBW; break; default: throw new CUDTException(5, 0, 0); } }
public static int setsockopt(UDTSOCKET u, int level, UDTOpt optname, Object optval, int optlen) { try { CUDT udt = s_UDTUnited.lookup(u); udt.setOpt(optname, optval, optlen); return 0; } catch (CUDTException e) { s_UDTUnited.setError(new CUDTException(e)); return ERROR; } catch (Exception e) { s_UDTUnited.setError(new CUDTException(-1, 0, 0)); return ERROR; } }
// Functionality: // Configure UDT options. // Parameters: // 0) [in] optName: The enum name of a UDT option. // 1) [in] optval: The value to be set. // 2) [in] optlen: size of "optval". // Returned value: // None. void setOpt(UDTOpt optName, Object optval, int optlen) { CGuard cg = new CGuard(m_ConnectionLock); CGuard sendguard = new CGuard(m_SendLock); CGuard recvguard = new CGuard(m_RecvLock); switch (optName) { case UDTOpt.UDT_MSS: if (m_bOpened) throw new CUDTException(5, 1, 0); if ((int)optval < (int)(28 + sizeof(CHandShake))) throw new CUDTException(5, 3, 0); m_iMSS = (int)optval; // Packet size cannot be greater than UDP buffer size if (m_iMSS > m_iUDPSndBufSize) m_iMSS = m_iUDPSndBufSize; if (m_iMSS > m_iUDPRcvBufSize) m_iMSS = m_iUDPRcvBufSize; break; case UDTOpt.UDT_SNDSYN: m_bSynSending = (bool)optval; break; case UDTOpt.UDT_RCVSYN: m_bSynRecving = (bool)optval; break; case UDTOpt.UDT_CC: if (m_bConnected) throw new CUDTException(5, 1, 0); //if (null != m_pCCFactory) // delete m_pCCFactory; m_pCCFactory = ((CCCVirtualFactory )optval).clone(); break; case UDTOpt.UDT_FC: if (m_bConnected) throw new CUDTException(5, 2, 0); if (*(int*)optval < 1) throw new CUDTException(5, 3); // Mimimum recv flight flag size is 32 packets if (*(int*)optval > 32) m_iFlightFlagSize = *(int*)optval; else m_iFlightFlagSize = 32; break; case UDTOpt.UDT_SNDBUF: if (m_bOpened) throw new CUDTException(5, 1, 0); if (*(int*)optval <= 0) throw new CUDTException(5, 3, 0); m_iSndBufSize = *(int*)optval / (m_iMSS - 28); break; case UDTOpt.UDT_RCVBUF: if (m_bOpened) throw new CUDTException(5, 1, 0); if (*(int*)optval <= 0) throw new CUDTException(5, 3, 0); // Mimimum recv buffer size is 32 packets if (*(int*)optval > (m_iMSS - 28) * 32) m_iRcvBufSize = *(int*)optval / (m_iMSS - 28); else m_iRcvBufSize = 32; // recv buffer MUST not be greater than FC size if (m_iRcvBufSize > m_iFlightFlagSize) m_iRcvBufSize = m_iFlightFlagSize; break; case UDTOpt.UDT_LINGER: m_Linger = *(linger*)optval; break; case UDTOpt.UDP_SNDBUF: if (m_bOpened) throw new CUDTException(5, 1, 0); m_iUDPSndBufSize = *(int*)optval; if (m_iUDPSndBufSize < m_iMSS) m_iUDPSndBufSize = m_iMSS; break; case UDTOpt.UDP_RCVBUF: if (m_bOpened) throw new CUDTException(5, 1, 0); m_iUDPRcvBufSize = *(int*)optval; if (m_iUDPRcvBufSize < m_iMSS) m_iUDPRcvBufSize = m_iMSS; break; case UDTOpt.UDT_RENDEZVOUS: if (m_bConnected) throw new CUDTException(5, 1, 0); m_bRendezvous = *(bool *)optval; break; case UDTOpt.UDT_SNDTIMEO: m_iSndTimeOut = *(int*)optval; break; case UDTOpt.UDT_RCVTIMEO: m_iRcvTimeOut = *(int*)optval; break; case UDTOpt.UDT_REUSEADDR: if (m_bOpened) throw new CUDTException(5, 1, 0); m_bReuseAddr = *(bool*)optval; break; case UDTOpt.UDT_MAXBW: if (m_bConnected) throw new CUDTException(5, 1, 0); m_llMaxBW = *(Int64*)optval; break; default: throw new CUDTException(5, 0, 0); } }