Привет. Есть сервер и клиент на разных машинах. Между сервером и клиентом проложено несколько параллелных сетевых каналов (кабелей).
Это сделано для надёжности.
Задача: при обрыве свзязи по одному каналу переключиться на следующий сетевой интерфейс. Для этого я воспользовался функцией QTcpSocket::bind.
Все работает отлично. Но есть один странный глюк.
Проще привести код, что бы объяснить.
void CArmClient::connectToServer()
{
switch (state()) {
case QAbstractSocket::UnconnectedState:
//case QAbstractSocket::BoundState:
{
fmustReconnect = true;
//проходимся по всем сетевым интерфейсам
foreach (const QNetworkInterface & networkIface, QNetworkInterface::allInterfaces()) {
qDebug("card %d:%s[%s]\tIsUp\t%d\tIsRunning\t%d",
networkIface.index(),
qPrintable(networkIface.humanReadableName()),
qPrintable(networkIface.hardwareAddress()),
networkIface.flags() & QNetworkInterface::IsUp?1:0,
networkIface.flags() & QNetworkInterface::IsRunning?1:0);
//нужно выбрать следующий доступный и поднятый интерфейс (т.е. с активным линком)
if(networkIface.isValid() && !(networkIface.flags() & QNetworkInterface::IsLoopBack) && (p_interface.hardwareAddress()!=networkIface.hardwareAddress()) && (networkIface.flags() & QNetworkInterface::IsUp) && !networkIface.addressEntries().isEmpty()) {
//qDebug("try bind client to %s",qPrintable(networkIface.addressEntries().first().ip().toString()));
if(!bind(networkIface.addressEntries().first().ip(),fconnectionConfig.port(),QAbstractSocket::ReuseAddressHint))
qDebug("Can't rebind client %s to network interface %s",qPrintable(fconnectionConfig.toString()),qPrintable(networkIface.humanReadableName()));
else
{
p_interface = networkIface;
emit networkInterfaceChange();
qDebug("Client %s has been rebound to %s",qPrintable(fconnectionConfig.toString()),qPrintable(networkIface.humanReadableName()));
}
break;
}
}
connectToHost(fconnectionConfig.host(),fconnectionConfig.port());
}
break;
default:
break;
}
}
Вобщем я прохожусь по всем QNetworkInterface, и нахожу тот, который активен (isUp). Проблема в том, что когда находится LoopBack интерфейс, на него биндится сокет, и почему то происходит коннект с сервером, хотя сервер на другой машине. Кто то может объяснить почему так? В коде я намеренно добавил условие
!(networkIface.flags() & QNetworkInterface::IsLoopBack).
Т.е. без него выбирается LoopBack интерфейс после разрыва (т.к. он всегда активен), но связь с удаленным сервером все равно осуществляется, хотя я ожидал что связи не будет и по таймауту будет выбран другой сетевой интерфейс. Сейчас в машине стоит для отладки 3 сетевых, и два кабеля.