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:
Shane Kearns 2012-05-09 17:06:47 +01:00 committed by Qt by Nokia
parent 653bca19c7
commit b72c8dd8a2
2 changed files with 17 additions and 4 deletions

View File

@ -89,9 +89,19 @@ static QHostAddress addressFromSockaddr(sockaddr *sa)
if (sa->sa_family == AF_INET)
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);
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;
}

View File

@ -91,9 +91,12 @@ static QHostAddress addressFromSockaddr(sockaddr *sa)
if (sa->sa_family == AF_INET)
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);
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);
return address;