UDP socket library improvements
This commit is contained in:
parent
c22a3c6e0f
commit
c7ab3ac858
1 changed files with 19 additions and 16 deletions
|
@ -1175,9 +1175,12 @@ void Socket::UDPConnection::SetDestination(std::string destIp, uint32_t port){
|
||||||
destAddr = malloc(destAddr_size);
|
destAddr = malloc(destAddr_size);
|
||||||
if (!destAddr){return;}
|
if (!destAddr){return;}
|
||||||
memcpy(destAddr, rp->ai_addr, rp->ai_addrlen);
|
memcpy(destAddr, rp->ai_addr, rp->ai_addrlen);
|
||||||
|
if (family != rp->ai_family){
|
||||||
|
INFO_MSG("Socket is wrong type (%s), re-opening as %s", addrFam(family), addrFam(rp->ai_family));
|
||||||
close();
|
close();
|
||||||
family = rp->ai_family;
|
family = rp->ai_family;
|
||||||
sock = socket(family, SOCK_DGRAM, 0);
|
sock = socket(family, SOCK_DGRAM, 0);
|
||||||
|
}
|
||||||
HIGH_MSG("Set UDP destination: %s:%d (%s)", destIp.c_str(), port, addrFam(family));
|
HIGH_MSG("Set UDP destination: %s:%d (%s)", destIp.c_str(), port, addrFam(family));
|
||||||
freeaddrinfo(result);
|
freeaddrinfo(result);
|
||||||
return;
|
return;
|
||||||
|
@ -1300,6 +1303,7 @@ uint16_t Socket::UDPConnection::bind(int port, std::string iface, const std::str
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string err_str;
|
std::string err_str;
|
||||||
|
uint16_t portNo = 0;
|
||||||
for (rp = addr_result; rp != NULL; rp = rp->ai_next){
|
for (rp = addr_result; rp != NULL; rp = rp->ai_next){
|
||||||
sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
|
sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
|
||||||
if (sock == -1){continue;}
|
if (sock == -1){continue;}
|
||||||
|
@ -1332,7 +1336,17 @@ uint16_t Socket::UDPConnection::bind(int port, std::string iface, const std::str
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (::bind(sock, rp->ai_addr, rp->ai_addrlen) == 0){
|
if (::bind(sock, rp->ai_addr, rp->ai_addrlen) == 0){
|
||||||
INFO_MSG("UDP bind success on %s:%s (%s)", human_addr, human_port, addrFam(rp->ai_family));
|
//get port number
|
||||||
|
struct sockaddr_storage fin_addr;
|
||||||
|
socklen_t alen = sizeof(fin_addr);
|
||||||
|
if (getsockname(sock, (struct sockaddr*)&fin_addr, &alen) == 0){
|
||||||
|
if (family == AF_INET6){
|
||||||
|
portNo = ntohs(((struct sockaddr_in6*)&fin_addr)->sin6_port);
|
||||||
|
}else{
|
||||||
|
portNo = ntohs(((struct sockaddr_in*)&fin_addr)->sin_port);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
INFO_MSG("UDP bind success on %s:%u (%s)", human_addr, portNo, addrFam(rp->ai_family));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (err_str.size()){err_str += ", ";}
|
if (err_str.size()){err_str += ", ";}
|
||||||
|
@ -1428,18 +1442,7 @@ uint16_t Socket::UDPConnection::bind(int port, std::string iface, const std::str
|
||||||
}
|
}
|
||||||
freeaddrinfo(resmulti); // free resolved multicast addr
|
freeaddrinfo(resmulti); // free resolved multicast addr
|
||||||
}
|
}
|
||||||
//get port number
|
return portNo;
|
||||||
struct sockaddr_storage fin_addr;
|
|
||||||
socklen_t alen = sizeof(fin_addr);
|
|
||||||
if (getsockname(sock, (struct sockaddr*)&fin_addr, &alen) == 0){
|
|
||||||
if (family == AF_INET6){
|
|
||||||
return ntohs(((struct sockaddr_in6*)&fin_addr)->sin6_port);
|
|
||||||
}else{
|
|
||||||
return ntohs(((struct sockaddr_in*)&fin_addr)->sin_port);
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Attempt to receive a UDP packet.
|
/// Attempt to receive a UDP packet.
|
||||||
|
|
Loading…
Add table
Reference in a new issue