wxSocketBase::Read(void* buffer, wxUint32 nbytes) Topic is solved

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
Blase_
In need of some credit
In need of some credit
Posts: 5
Joined: Tue Mar 09, 2010 1:34 pm

wxSocketBase::Read(void* buffer, wxUint32 nbytes)

Post by Blase_ » Mon Jun 07, 2010 2:51 pm

клиент не получает ответы от сервера более 1000 байт Win7 (путь до сервера: Wi-Fi -> локалка -> порт который мапится на виртуальную машину), более 2900 байт WinXP (путь до сервера: порт который мапится на виртуальную машину).
для получния ответа от сервера использую wxSocketBase::Read(void* buffer, wxUint32 nbytes)

сам сервер: Linux version 2.6.26-2-686 (Debian 2.6.26-21lenny4) ([email protected]) (gcc version 4.1.3 20080704 (prerelease) (Debian 4.1.2-25))

Приложение клиент: Апач + скрипт на PHP
Пакет: apache2
Состояние: установлен
Автоматически установлен: нет
Версия: 2.2.9-10+lenny7

Пакет: libapache2-mod-php5
Состояние: установлен
Автоматически установлен: нет
Версия: 5.2.6.dfsg.1-1+lenny8

код вызвавший затруднения

Code: Select all

    wxSocketClient * socket = new  wxSocketClient(); 
    header = "POST /";
    header += globalsrvpage;	// страница
    header += " HTTP/1.1\r\n"; 
    header += "Host: ";
    header += globasrvstring;	// адрес сервера
    header += "\r\n"; 
    header += globalsrvsid; 	// PHP-SID
    header += "\r\n"; 
    header += "Accept-Language: ru\r\n";
    header += "Accept-Charset: Windows-1251\r\n";
    header += "Content-Language: ru\r\n";
    header += "Content-Charset: Windows-1251\r\n";
    //header += "User-Agent: Blase_Client/1.0\nKeep-Alive: 10\r\n";
    header += "Content-Type: application/x-www-form-urlencoded; charset=Windows-1251\r\n";
    header += "Content-Length: ";
    header += wxString::Format("%d", request.Len());
    header += "\r\n\r\n"; 

    // 3) соединиться с сервером
    wxIPV4address * address = new  wxIPV4address();
    address->Hostname(globasrvstring);
    address->Service(globalsrvport); 
    socket->SetTimeout(5);
    socket->Connect(*address, false);
    socket->WaitOnConnect(6, 0);
    if(socket->IsConnected()) // если соединение установлено то пытаемся отправить и получить данные, иначе выводим ошибку
    {
        // 4) отослать заголовок
        socket->Write(header.c_str(), header.Len());
        // 5) отослать запрос
        socket->Write(request.c_str(), request.Len());
    // 6) получить ответ 
        //Get Response
        //socket->Read(buf.GetWriteBuf(12000), 12000);
        socket->WaitForRead (6, 0);		
        socket->Read(buf.GetWriteBuf(6000), 6000);
        //socket->WaitForLost(2, 0);
        buf.UngetWriteBuf();
        buf = buf.SubString(0,socket->LastCount()-1); // обрезание строки
    }
    else //выводим ошибку
    {
        wxMessageBox(_T("\t ОШИБКА \n не удалось подключиться к серверу")); 
        return (false);
    }
    socket->Destroy();
что делает кусок кода:
1) создаёт правильный HTTP заголовок
2) отправляет заголовок и тело запроса
(в первых 2х пунктах проблем не обнаружено)
3) получает ответ от сервера (вот тут оно и начинается)


образец откуда слизал вот: http://forums.wxwidgets.org/viewtopic.p ... =http+post
(пост turova)

помогите плзз разобрать причину, либо разобрать по человечески http://forums.wxwidgets.org/viewtopic.p ... =http+post
так же открыт для других предложений.

Blase_
In need of some credit
In need of some credit
Posts: 5
Joined: Tue Mar 09, 2010 1:34 pm

Post by Blase_ » Mon Jun 07, 2010 2:55 pm

забыл добавить, вывод сервера проверял фаерфоксом с плагином Poster сервер отрабатывает всё правильно, огнелис получает всё что прислал сервер.

Blase_
In need of some credit
In need of some credit
Posts: 5
Joined: Tue Mar 09, 2010 1:34 pm

Post by Blase_ » Tue Jun 08, 2010 8:09 am

Вопрос решён, проблема не внимательность собственная

Code: Select all

socket->SetFlags(wxSOCKET_WAITALL);
но если за комментировать

Code: Select all

socket->SetTimeout(6);
то он ждёт от 30 сек до 2х мин самое большое.
с socket->SetTimeout(6); всегда ждёт 6 сек что не есть гуд.

с таймаутом поэксперементирую найду оптимальные имхо 6 сек много, хотя может помочь при больших объёмах данных (а именно с большими и придётся работать)

альтернативные варианты всёравно рассматриваю (через пару дней если ничего нового не будет то отмечу как решение этот пост)

Post Reply