示例#1
0
void C4Network2Client::AddLocalAddrs(int16_t iPortTCP, int16_t iPortUDP) {
  // set up address struct
  sockaddr_in addr;
  ZeroMem(&addr, sizeof addr);
  addr.sin_family = AF_INET;

  // get local address(es)
  in_addr **ppAddr = NULL;
#ifdef HAVE_WINSOCK
  bool fGotWinSock = AcquireWinSock();
  if (fGotWinSock)
#endif
  {
    // get local host name
    char szLocalHostName[128 + 1];
    *szLocalHostName = '\0';
    ::gethostname(szLocalHostName, 128);
    // get hostent-struct
    hostent *ph = ::gethostbyname(szLocalHostName);
    // check type, get addr list
    if (ph)
      if (ph->h_addrtype != AF_INET)
        ph = NULL;
      else
        ppAddr = reinterpret_cast<in_addr **>(ph->h_addr_list);
  }

  // add address(es)
  for (;;) {
    if (iPortTCP >= 0) {
      addr.sin_port = htons(iPortTCP);
      AddAddr(C4Network2Address(addr, P_TCP), false);
    }
    if (iPortUDP >= 0) {
      addr.sin_port = htons(iPortUDP);
      AddAddr(C4Network2Address(addr, P_UDP), false);
    }
    // get next
    if (!ppAddr || !*ppAddr) break;
    addr.sin_addr = **ppAddr++;
  }

#ifdef HAVE_WINSOCK
  if (fGotWinSock) ReleaseWinSock();
#endif
}
C4DownloadDlg::~C4DownloadDlg()
{
#ifdef HAVE_WINSOCK
	if (fWinSock) ReleaseWinSock();
#endif
}
示例#3
0
void C4Network2Client::AddLocalAddrs(int16_t iPortTCP, int16_t iPortUDP)
{
	// set up address struct
	sockaddr_in addr; ZeroMem(&addr, sizeof addr);
	addr.sin_family = AF_INET;

	// get local address(es)
	in_addr **ppAddr = NULL;
#ifdef HAVE_WINSOCK
	bool fGotWinSock = AcquireWinSock();
	if (fGotWinSock)
	{
		// get local host name
		char szLocalHostName[128+1]; *szLocalHostName = '\0';
		::gethostname(szLocalHostName, 128);
		// get hostent-struct
		hostent *ph = ::gethostbyname(szLocalHostName);
		// check type, get addr list
		if (ph)
		{
			if (ph->h_addrtype != AF_INET)
				ph = NULL;
			else
				ppAddr = reinterpret_cast<in_addr **>(ph->h_addr_list);
		}
	}
#else
	std::vector<in_addr*> addr_vec;
	struct ifaddrs* addrs;
	getifaddrs(&addrs);
	for(struct ifaddrs* addr = addrs; addr != NULL; addr = addr->ifa_next)
	{
		struct sockaddr* ad = addr->ifa_addr;
		if(ad == NULL) continue;

		if(ad->sa_family == AF_INET && (~addr->ifa_flags & IFF_LOOPBACK)) // Choose only non-loopback IPv4 devices
			addr_vec.push_back(&reinterpret_cast<sockaddr_in*>(ad)->sin_addr);
	}

	addr_vec.push_back(NULL);
	ppAddr = &addr_vec[0];
#endif

	// add address(es)
	for (;;)
	{
		if (iPortTCP >= 0)
		{
			addr.sin_port = htons(iPortTCP);
			AddAddr(C4Network2Address(addr, P_TCP), false);
		}
		if (iPortUDP >= 0)
		{
			addr.sin_port = htons(iPortUDP);
			AddAddr(C4Network2Address(addr, P_UDP), false);
		}
		// get next
		if (!ppAddr || !*ppAddr) break;
		addr.sin_addr = **ppAddr++;
	}

#ifdef HAVE_WINSOCK
	if (fGotWinSock) ReleaseWinSock();
#else
	if(addrs) freeifaddrs(addrs);
#endif
}