LINUX.ORG.RU

Ошибка «Connection refused» Qt

 


0

1

Добрый день!

Имеется плата с двумя интерфейсами на борту - эзернет (eth0) и usb modem (eth1). Написана прога на Qt с использованием QSslSocket. Если в модем вставлена сим-карта, то можно прибиндиться к любому интерфейсу и слать через него данные на сервер. Но стоит вынуть симку из модема, начинается ерунда. При попытке прибиндиться к eth0 возникает ошибка «Connection refused», и никаким способом от нее не избавиться. Помогите, плиз, куда копать?

if(socket->bind(QHostAddress(ip_addr), 8080, QAbstractSocket::DontShareAddress)) 
{
     socket->connectToHostEncrypted(url.host(), 443, QIODevice::ReadWrite, QAbstractSocket::AnyIPProtocol);
}

Лог:

Bind to ip "192.168.1.66"
>>> clnt: QAbstractSocket::BoundState
Bind is OK
>>> clnt: connectToHostEncrypted()
>>> clnt: QAbstractSocket::HostLookupState
>>> clnt: QAbstractSocket::ConnectingState
>>> clnt: Host Found
>>> clnt: QAbstractSocket::UnconnectedState
>>> clnt:  socketError  "Connection refused"

После возникновения ошибки попытка биндинга:

Bind to ip "192.168.1.66"
Create new socket
Bind is OK
>>> clnt: connectToHostEncrypted()

Видно, что сокет не меняет своего состояния.

Пробовал в обработчике ошибки удалять сокет и создавать новый перед биндом - не помогает.



Последнее исправление: AlexVM2020 (всего исправлений: 3)

Ответ на: комментарий от AlexVM2020

с ShareAddress такая же история

А если совсем не задавать? По умолчанию там другое значение.

И, кстати, обязательно исходящий порт должен быть только 8080, а первый свободный не подойдёт?

raspopov
()
Ответ на: комментарий от raspopov

Ситуация такая - после ошибки надо заново биндиться к требуемому интерфейсу, ошибка сбрасывает настройки сокета, судя по всему, и он лезет коннектиться к дефолтному интерфейсу.

И еще помогло полное уничтожение сокета после вышеназванной ошибки, иначе другой интерфейс не работает с этим же сокетом. После бинда, естественно. Не помогает ни close(), ни abort().

AlexVM2020
() автор топика
Последнее исправление: AlexVM2020 (всего исправлений: 1)
Ответ на: комментарий от AlexVM2020

У меня несколько интерфейсов

Если не ошибаюсь, то интерфейсы и сокеты работают на разных уровнях абстракции, сокет вяжется не с интерфейсом, а с адресом источника, а где он конкретно физически его не касается. А вот когда дело дойдёт до фактической отсылки пакета, тогда по таблице маршрутов будет окончательное сопоставление и выбор интерфейса.

Настройки же шаринга порта и адреса нужны в первую очередь не для того что вы думаете, а для безопасности, или, гораздо реже, для специфического дизайна нескольких серверов на одном порту (имеет смысл в основном для датаграм-протоколов).

raspopov
()
Ответ на: комментарий от raspopov

Если не ошибаюсь, то интерфейсы и сокеты работают на разных уровнях абстракции, сокет вяжется не с интерфейсом, а с адресом источника, а где он конкретно физически его не касается. А вот когда дело дойдёт до фактической отсылки пакета, тогда по таблице маршрутов будет окончательное сопоставление и выбор интерфейса.

У меня задача отправить именно с нужного интерфейса. Поэтому сначала я средствами кьюта по имени интерфейса определяю его адрес, и потом привязываю сокет к этому адресу. Подозреваю, что кьют сопоставляет адрес интерфейса с его именем по таблице маршрутов.

AlexVM2020
() автор топика