Problem z QHttp - jak zwalniac porty?

0

Mam następujący problem

1 - Mam wątek
2 - W wątku tworzę obiekt QHttp
3 - uruchamiam wątki -> tworzy się połączenie HTTP, robi co tam trzeba, ale po zakończonej operacji

TCP 192.168.0.122:55770 fx-in-f113:http CZAS_OCZEKIWANIA
TCP 192.168.0.122:55771 fx-in-f100:http CZAS_OCZEKIWANIA
TCP 192.168.0.122:55772 fx-in-f101:http CZAS_OCZEKIWANIA
TCP 192.168.0.122:55773 fx-in-f102:http CZAS_OCZEKIWANIA
TCP 192.168.0.122:55774 fx-in-f113:http CZAS_OCZEKIWANIA
TCP 192.168.0.122:55775 fx-in-f100:http CZAS_OCZEKIWANIA
TCP 192.168.0.122:55776 fx-in-f101:http CZAS_OCZEKIWANIA

nie są zwalniane porty - tj po jakimś czasie są - ale jak się wątków narobi ileś tam to następuje zapchanie i QHttp nie działa tak szybko jak by mogło

chodzi mi o to, żeby po wykonaniu żądania nie przechodził port w czas oczekiwania ale był zwalniany

jak to zrobić?

chodzi mi o sposób w jakim

0

Po pierwsze - pokaż kod.
Po drugie - Nie używaj już QHttp

0
Mati napisał(a)

Po pierwsze - pokaż kod.
Po drugie - Nie używaj już QHttp

QGetTileWebThread::QGetTileWebThread(QMapWidget  *A_pMapWidget, QMapTile *A_pMapTile, int A_iTileX, int A_iTileY, int A_iZoom, QObject *parent) :
    QGetTileThread(A_pMapWidget, A_pMapTile, A_iTileX, A_iTileY, A_iZoom, parent),
    m_iReqID(0)
{
    m_pTileRequests = QMapTileRequests::GetInstance();
    m_pHttpStorage  = QHttpStorage::GetInstance();

    connect(this, SIGNAL(terminated()), SLOT(slotFinished()));
    connect(this, SIGNAL(signalLoadImage(QMapWidget *,int,int,int)), this, SLOT(slotGetImageFromNet(QMapWidget*,int,int,int)));
}


void QGetTileWebThread::run()
{
    if(m_pMapWidget)
        emit signalLoadImage(m_pMapWidget, m_iTileX, m_iTileY, m_iZoom);
}

void QGetTileWebThread::slotGetImageFromNet(QMapWidget *A_pMapWidget, int A_iTileX, int A_iTileY, int A_iZoom)
{
    m_pHttp = new QHttp(this);

    if(!m_pHttp)
        return;

    connect(m_pHttp, SIGNAL(requestFinished(int,bool)), this, SLOT(slotRequestHttpFinished(int, bool)));
    connect(m_pHttp, SIGNAL(done(bool)), this, SLOT(slotDone(bool)));
    connect(m_pHttp, SIGNAL(stateChanged(int)), this, SLOT(slotStateChanged(int)));


    QString strTile = QString("/%1/%2/%3").arg(A_iZoom).arg(A_iTileX).arg(A_iTileY);
    QString strURL  = QString("http://%1%2/%3.png").arg(strServer).arg(MAP_HOST).arg(strTile);
    QTileStorage *pTileStorage = QTileStorage::GetInstance();

    m_http.setHost(strServer + MAP_HOST);

    QHttpRequestHeader header("GET", strURL);
    header.setValue("User-Agent", "Mozilla");


    m_iReqID = m_pHttp->request(header);

    if(m_pTileRequests && pTileStorage)
        m_pTileRequests->InsertIntoMap(m_iReqID, pTileStorage->CreateCasheKey(A_iTileX, A_iTileY, A_iZoom));
    if(m_pHttpStorage)
        m_pHttpStorage->InsertIntoMap(m_iReqID, m_pHttp);

}

void QGetTileWebThread::slotRequestHttpFinished(int A_iRequest, bool A_bError)
{
    bool          bContinue = true;
    QPixmap       pixmap;
    QByteArray    byarData;
    QTileStorage *pTileStorage = QTileStorage::GetInstance();
    QMapSettings *pMapSettings = QMapSettings::GetInstance();

    if(!A_bError && m_pHttp && m_pHttp->bytesAvailable() > 0)
    {

        byarData = m_pHttp->readAll();
        bContinue = pixmap.loadFromData(byarData);

        if(bContinue)
           bContinue = pTileStorage->InsertTileTntoStorage(m_iTileX, m_iTileY, m_iZoom, pixmap);
        else
           pTileStorage->InsertIntoErrorTile(m_iTileX, m_iTileY, m_iZoom);
        m_pTileRequests->RemoveFromMap(m_iReqID);

        if(m_pMapWidget && m_pMapTile)
            m_pMapWidget->update(m_pMapTile->x(), m_pMapTile->y(), pMapSettings->GetTileSize(), pMapSettings->GetTileSize());
        if(m_pHttpStorage)
            m_pHttpStorage->RemoveFromMap(m_iReqID);
    }

    if(m_pTileRequests->AllRequestsCompleed() && m_pHttpStorage)
        m_pHttpStorage->RelaseHttp();

}

void QGetTileWebThread::slotFinished()
{
//    if(m_pHttp.currentId() == m_iReqID)
//    {
//        m_pHttp.abort();
//        m_pHttp.closeConnection();
//        m_pHttp.close();
//        m_pTileRequests->RemoveFromMap(m_iReqID);
//    }
}

void QGetTileWebThread::slotDone(bool A_bError)
{
//     m_pHttp.abort();
//     m_pHttp.closeConnection();
//     m_pHttp.close();
//     m_pHttp.clearPendingRequests();
}

void QGetTileWebThread::slotStateChanged(int A_iState)
{
    if(A_iState == QHttp::Unconnected)
        m_pHttpStorage->RemoveFromMap(m_iReqID);
}


 

może trochę kombinowania jest - ale coś tam próbuję rozkminić

2 - czemu?

zresztą znalazłem inny sposób na pobieranie z sieci czegoś oparty na QNetworkAccessManager
i problem był ten sam

3 - co więcej nie wiem czemu ale przy metodzie request mam identyfikatory parzyste, a gdy odbieram żądanie (reakcja na sygnał requestFinished) mam identyfikatory nieparzyste

no i nie wiem skąd i czemu to tak - ogólnie działa dobrze, póki sięnie zapcha - jak sobie puszczę czasami netstat to mam tego dużo na liście

próbowałem zrobić w osobnej klasie mapę do przechowywania wskaźników do QHttp na zasadzie
id żądania - wskaźnik do QHttp, ale jako, że w mapie mam same idiki parzyste, a przy requestFinished przychodzą mi idiki nieparzyste to sam nie wiem co robić i jak to zrobić, aby było dobrze, tj po skończonym żądaniu HTTP port (połączenie) nie wisiał(o)

0
  1. Dlatego, że w dokumentacji pisze: This class is obsolete. It is provided to keep old source code working. We strongly advise against using it in new code.

  2. Miałem ten problem, tylko że nie z QT :( ... wystarczyło ustawić SO_REUSEADDR :

  
 int flag = 1;
 result = setsockopt( listensock, SOL_SOCKET, SO_REUSEADDR, ( char * ) &flag, sizeof (int ) );
0
Mati napisał(a)
  1. Dlatego, że w dokumentacji pisze: This class is obsolete. It is provided to keep old source code working. We strongly advise against using it in new code.

  2. Miałem ten problem, tylko że nie z QT :( ... wystarczyło ustawić SO_REUSEADDR :

int flag = 1;
result = setsockopt( listensock, SOL_SOCKET, SO_REUSEADDR, ( char * ) &flag, sizeof (int ) );




dziękuję bardzo za wskazówkę

ale przekładając to na Qt mam zrobić pobieranie grafiki z URL-a za pomocą np QTCPSocket?

czy dobrze rozumuję?
0

mam taką prośbę

czy ktoś wie jak powyższy przykład (Mati) przerobić na QT - jedyne co znalazłem dot SO_REUSEADDR jest to opis z QUDPSocet dot flagi QUdpSocket::ReuseAddressHint że jest ona odpowiednikiem windowsowego SO_REUSEADDR

OK - ale ja bym np chciał to zrobić za pomocą QNetworkAccessManager i QNetworkReply

i teraz pewnie gdzieś trzeba ustawić opcję "SO_REUSEADDR" *czy jak się ona w Qt nazywa

jest tam (w klasie QNetworkAccessManager) metoda setConfiguration

zakładam że to tu trzeba ustawić - ale tak jak przeglądam QNetworkConfiguration to chyba nie o to chodzi - o co mi chodzi

no i jest problem - bo w zasadzie nie widzę miejsca, metody itp gdzie można by to ustawić (może źle szukam) - może źle do tego podchodzę i w ogólnie nie powinienem brać pod uwagę QNetworkAccessManager i QNetworkReply

w zasadzie nie wiem jak ten problem rozwiązać

jakby ktoś miał pomysł i się nim podzielił to z góry dziękuję

1 użytkowników online, w tym zalogowanych: 0, gości: 1