Include scope ids in QHostAddress from QNetworkInterface
The scope ID is a required part of the address for link local addresses (to solve the problem of the same link local address being created by two machines on different networks). It is required to send packets to a link local address on Mac and Windows, although Linux multicasts if scope is missing. Task-number: QTBUG-25634 Change-Id: Ie2bb09df8d261eefcb81716bafeb1475f0bed5fe Reviewed-by: Martin Petersson <Martin.Petersson@nokia.com>
This commit is contained in:
parent
653bca19c7
commit
b72c8dd8a2
@ -89,9 +89,19 @@ static QHostAddress addressFromSockaddr(sockaddr *sa)
|
|||||||
|
|
||||||
if (sa->sa_family == AF_INET)
|
if (sa->sa_family == AF_INET)
|
||||||
address.setAddress(htonl(((sockaddr_in *)sa)->sin_addr.s_addr));
|
address.setAddress(htonl(((sockaddr_in *)sa)->sin_addr.s_addr));
|
||||||
else if (sa->sa_family == AF_INET6)
|
else if (sa->sa_family == AF_INET6) {
|
||||||
address.setAddress(((sockaddr_in6 *)sa)->sin6_addr.s6_addr);
|
address.setAddress(((sockaddr_in6 *)sa)->sin6_addr.s6_addr);
|
||||||
|
int scope = ((sockaddr_in6 *)sa)->sin6_scope_id;
|
||||||
|
if (scope) {
|
||||||
|
#ifndef QT_NO_IPV6IFNAME
|
||||||
|
char scopeid[IFNAMSIZ];
|
||||||
|
if (::if_indextoname(scope, scopeid)) {
|
||||||
|
address.setScopeId(QLatin1String(scopeid));
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
|
address.setScopeId(QString::number(scope));
|
||||||
|
}
|
||||||
|
}
|
||||||
return address;
|
return address;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -91,9 +91,12 @@ static QHostAddress addressFromSockaddr(sockaddr *sa)
|
|||||||
|
|
||||||
if (sa->sa_family == AF_INET)
|
if (sa->sa_family == AF_INET)
|
||||||
address.setAddress(htonl(((sockaddr_in *)sa)->sin_addr.s_addr));
|
address.setAddress(htonl(((sockaddr_in *)sa)->sin_addr.s_addr));
|
||||||
else if (sa->sa_family == AF_INET6)
|
else if (sa->sa_family == AF_INET6) {
|
||||||
address.setAddress(((qt_sockaddr_in6 *)sa)->sin6_addr.qt_s6_addr);
|
address.setAddress(((qt_sockaddr_in6 *)sa)->sin6_addr.qt_s6_addr);
|
||||||
else
|
int scope = ((qt_sockaddr_in6 *)sa)->sin6_scope_id;
|
||||||
|
if (scope)
|
||||||
|
address.setScopeId(QString::number(scope));
|
||||||
|
} else
|
||||||
qWarning("Got unknown socket family %d", sa->sa_family);
|
qWarning("Got unknown socket family %d", sa->sa_family);
|
||||||
return address;
|
return address;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user