Russian Qt Forum
Октябрь 04, 2024, 02:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: Как привязать QTcpSocket к конкретной сетевой плате?  (Прочитано 19771 раз)
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #30 : Январь 30, 2013, 18:27 »

Получилось забиндиться по разным сетевым картам, код ниже, но не получаю события при потере связи (если выдергиваю шнурок с карты)

Код:
void     QRawClient::connectToServer()
{
    if(fsocket.state() != QAbstractSocket::UnconnectedState) return;

    fmustReconnect = true;
    if(connectionConfig().interfaceIndex()>=0)
    {
        if(!fbindAddress.isNull())   //если биндинг задан, создаем сокет посредством Qt
        {
            qDebug("Try bind %i:%s to %s",connectionConfig().interfaceIndex(),qPrintable(connectionConfig().host()),qPrintable(fbindAddress.toString()));

            int fd = fsocket.socketDescriptor();
            if(fd<0)
            {
                fd = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
            }

            struct sockaddr_in bindAddr;

            memset(&bindAddr,0,sizeof(bindAddr));

            bindAddr.sin_family = PF_INET;
            bindAddr.sin_addr.s_addr = htonl(fbindAddress.toIPv4Address());

            if(bind(fd,(const struct sockaddr *)&bindAddr,sizeof(bindAddr))!=0)
            {
                qDebug("Socket bind to %s failed with reason %s",qPrintable(fbindAddress.toString()),strerror(errno));
                shutdown(fd,2);
#ifdef Q_WS_WIN32
closesocket(fd);
#else
                close(fd);
                return;
#endif
            }

            struct sockaddr_in connect_addr;
            memset(&connect_addr,0,sizeof(connect_addr));
            connect_addr.sin_family = PF_INET;
            connect_addr.sin_port = htons(connectionConfig().port());

            QHostAddress address(connectionConfig().host());
            connect_addr.sin_addr.s_addr = htonl(address.toIPv4Address());

            int connect_result = ::connect(fd,(const struct sockaddr *)&connect_addr,sizeof(connect_addr));
            qDebug("connect result %i",connect_result);
            if(connect_result==-1)
            {
                qDebug("connect error! %s",strerror(errno));
                close(fd);
                return;
            }
            else
            {
                bool bind_result = fsocket.setSocketDescriptor(fd,QAbstractSocket::ConnectedState);
                if(!bind_result)
                    qDebug("binding to native socket failed");
                else
                    qDebug("binding to native socket succsseeded");

                emit connectedToServer();
            }

            //fsocket.connectToHost(connectionConfig().host(),connectionConfig().port());
        }
    }
}

На ноуте где одна сетевая, при выдергивании сетевой я получаю событие о потере связи, а на двух сетевых нет...
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.043 секунд. Запросов: 22.