Exemplo n.º 1
0
bool MiniUPnPInterface::removePortForward(const NATPortMapping& mapping) {
	if (!p->isValid) {
		return false;
	}

	std::string publicPort = boost::lexical_cast<std::string>(mapping.getPublicPort());
	std::string localPort = boost::lexical_cast<std::string>(mapping.getLocalPort());
	std::string leaseSeconds = boost::lexical_cast<std::string>(mapping.getLeaseInSeconds());

	int ret = UPNP_DeletePortMapping(p->urls.controlURL, p->data.first.servicetype, publicPort.c_str(), mapping.getProtocol() == NATPortMapping::TCP ? "TCP" : "UDP", 0);
	return ret == UPNPCOMMAND_SUCCESS;
}
bool NATPMPInterface::removePortForward(const NATPortMapping& mapping) {
	if (sendnewportmappingrequest(&p->natpmp, mapping.getProtocol() == NATPortMapping::TCP ? NATPMP_PROTOCOL_TCP : NATPMP_PROTOCOL_UDP, 0, 0, mapping.getLocalPort()) < 0) {
		SWIFT_LOG(debug) << "Failed to send NAT-PMP remove forwarding request!" << std::endl;
		return false;
	}

	int r = 0;
	natpmpresp_t response;
	do {
	  fd_set fds;
	  struct timeval timeout;
	  FD_ZERO(&fds);
	  FD_SET(p->natpmp.s, &fds);
	  getnatpmprequesttimeout(&p->natpmp, &timeout);
	  select(FD_SETSIZE, &fds, NULL, NULL, &timeout);
	  r = readnatpmpresponseorretry(&p->natpmp, &response);
	} while(r == NATPMP_TRYAGAIN);

	if (r == 0) {
		return true;
	}
	else {
		SWIFT_LOG(debug) << "Invalid NAT-PMP response." << std::endl;
		return false;
	}
}