Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос про сокет 
:(
    Опции темы
TGrey
Дата 23.7.2010, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 1.12.2007

Репутация: нет
Всего: 1



Здравствуйте, есть консольное приложение которое с помощь сокетов грузит картинку из интернета.
Структура программы самая тривиальная
-вса
-создать соке
-коннект
-отослать запрос
-получать ответ
-закрыть сокет

Все отлично работает в консорли, в прочем, как и везде, но проблема в том, что работает оно 1 раз. Я перегнал код в Borland и мне нужно вызывать скачку неоднократно, но после первого раза оно выдает ошибку конекта, отправки запроса. К какому шагу нужно вернутся или что надо сделать, что бы качать так сказать неограниченное кол-во раз?
Спасибо.
PM MAIL   Вверх
_Dimon_
Дата 23.7.2010, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 25.6.2007
Где: Украина

Репутация: 1
Всего: 1



Телепаты в отпуске!!!!!
Код давай  smile 
PM MAIL   Вверх
TGrey
Дата 23.7.2010, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 1.12.2007

Репутация: нет
Всего: 1



Так код рабочий, тут вопрос по принципам работы сокета. Не просто же так он отказывается качать 2 раз.
Код

void __fastcall TForm1::FormCreate(TObject *Sender)
{
        if (WSAStartup (0x0101, &wsa) != 0)
        ShowMessage("Error WSA");
    if (INVALID_SOCKET == (so = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)))
        ShowMessage("Socket Error");

        addr.sin_family = AF_INET;
    addr.sin_addr.S_un.S_addr = inet_addr(getip(url));
    addr.sin_port = htons(80);

        CPaint();
        //web->Navigate(L"newuo.com/1.html",0,0,0,0);

}

void __fastcall TForm1::pbuMouseUp(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{

                if (SOCKET_ERROR == connect (so, (sockaddr*)&addr, sizeof (addr)))
                ShowMessage("Connection Error");

            if (SOCKET_ERROR == send (so, query.c_str(), (long)query.length(), 0))
                ShowMessage("Send request Error");


                name = url.substr(url.rfind("/")+1, url.length());

            if ((stream = fopen(name.c_str(), "wb")) == NULL)
                ShowMessage("File Error");
}

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
        ZeroMemory(buff,sizeof(buff));
        len = recv (so, (char*)&buff, 4096, 0);
        if( len > 0 )
        {
        curr+=len;
        string ct = (char*)buff;
        if ( (pos = ct.find("Content-Length: ")) > 0)
                {
            lenght = GetFileSize(ct);
                        getl = true;
                }
        int start = ct.find("\r\n\r\n") + 4;
        if (start == 3)
            start = 0;
        else
            curr-=start;
        fwrite((void*)(buff + start), len - start, 1, stream);

                Label2->Caption = IntToStr(curr);
                Label2->Caption = Label2->Caption + "\\";
                Label2->Caption = Label2->Caption + IntToStr(lenght);
                Label2->Caption = Label2->Caption + "kb";
                perc = (float)curr/(float)lenght*100;
                if( perc == 0 )
                {
                        fx = 50+perc*4;
                        getl = false;
                }
                else
                        fx = 50+perc*4;
        }
        else
        {
                Timer1->Enabled = false;
                done = true;
                progress = false;
                off = true;
                curr = lenght = 0;
                
                if (name != "")
                        fclose(stream);
                if (SOCKET_ERROR == closesocket(so))
                        ShowMessage("Close Socket Error");
                        
                //ShowMessage("Complete");
        }
}


Вот часть с сокетами. Первый раз качает, как пологается, на 2 выдает сообщения

                ShowMessage("Connection Error");
                ShowMessage("Send request Error");
                        ShowMessage("Close Socket Error");
PM MAIL   Вверх
SVN74
Дата 24.7.2010, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

Репутация: 11
Всего: 18



Для закачки файла лучше использовать цикл, так как если в обработчике таймера произойдет "приостановка" -  будет ошибка.
PM MAIL WWW   Вверх
TGrey
Дата 24.7.2010, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 1.12.2007

Репутация: нет
Всего: 1



Ну цикл, циклом. А вопрос остается открытым.
PM MAIL   Вверх
mrbrooks
Дата 26.7.2010, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306




Цитата(TGrey @  24.7.2010,  22:07 Найти цитируемый пост)
Ну цикл, циклом. А вопрос остается открытым. 

дык у тебя не в цикле же smile до этих пор он будет открыт вечно.

вынеси инициализацию и соединение в метод твоей кнопки, а send\recv в таймер. в нем же анализируй состояние процесса.

вообще, данный подход не очень удачный с точки зрения архитектуры. но это дело выбора. 

зы. я бы использовал готовый враппер для этих операций. к примеру Indy. данную задачу решать на таком низком уровне, как на сокетах, не кошерно. 
PM MAIL   Вверх
TGrey
Дата 26.7.2010, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 1.12.2007

Репутация: нет
Всего: 1



Да попробую) Просто пишу на сокетах потому что работал только с ними) Приложение мне надо с формой, а на АПИ мне все лень писать, дизайн всмысле. Потому выбрал борлэнд и загнал в него код сокета.
PM MAIL   Вверх
Domain
Дата 15.8.2010, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 11.3.2010

Репутация: нет
Всего: нет



имхо для такого можно и tcp/ip client-server борландовский использовать.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0505 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.