Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

БИДА! Не правильно пересалаются данные. IdTCPClient/Server

33K
16 ноября 2010 года
hivewarrior
205 / / 16.11.2010
Здравствуй форум.
Пишу клиент серверное приложение на IdTCPClient и соответственно IdTCPServer.
Все хорошо и интересно. Сначала шло как по маслу, но сейчас случилось непредвиденное. В середине работы программы сервер начинает принимать не совсем, а скорее даже совсем, не то, что ему отправляли. Проблема примерно тут.
Сервер.
Код:
void __fastcall TForm1::IdTCPServer1Execute(TIdPeerThread *AThread)
{
        int l;
        AnsiString s,t;
        int cmd=AThread->Connection->ReadInteger(false);
        switch(cmd)
        {
        case 1:
    // Бла бла бла
                        break;
                }
        case 2:
                {
                        l=AThread->Connection->ReadInteger(false);
                        if(this->UserRightCheck(l))
                        {
                                AThread->Connection->WriteInteger(256,false);
                                TFileStream* fs=new TFileStream(ExtractFilePath(Application->ExeName)+"tmp.swf",fmOpenWrite|fmCreate);
                                s=AThread->Connection->ReadString(19);
                                l=AThread->Connection->ReadInteger(false);
                                this->timetable->WriteInteger(s,"Iteration",l);
                                l=AThread->Connection->ReadInteger(false);
                                this->timetable->WriteInteger(s,"Delay",l);
                                l=AThread->Connection->ReadInteger(false);
                                this->timetable->WriteBool(s,"Double",l);
                                l=AThread->Connection->ReadInteger(false);
                                this->timetable->WriteBool(s,"Cookie",l);
                                l=AThread->Connection->ReadInteger(false);
                                this->timetable->WriteBool(s,"Enabled",l);
                                l=AThread->Connection->ReadInteger(false);
                                t=AThread->Connection->ReadString(l);
                                this->timetable->WriteString(s,"ProxyServer",t);
                                l=AThread->Connection->ReadInteger(false);
                                this->timetable->WriteInteger(s,"ProxyPort",l);
                                l=AThread->Connection->ReadInteger(false);
                                AThread->Connection->ReadStream(fs,l,false);
                                delete fs;
                        }
                        else
                        {
                                AThread->Connection->WriteInteger(512,false);
                        }
                }
        }
}

Клиент.
Код:
void __fastcall TForm1::Button3Click(TObject *Sender)
{
        int l;
        if(this->Connected)
        {
                int i;
                for(i=0;i<this->NewInterface->InterfaceAmount;i++)
                {
                        if(this->RadioButtonArray1->Checked==true)
                        {      
                                TDateTime section=0;
                                section=this->DateTimePicker2->DateTime+this->MaskEdit1->Text.SubString(1,2).ToDouble()/24+this->MaskEdit1->Text.SubString(4,2).ToDouble()/1440;
                                TFileStream* fs=new TFileStream(this->EditArray1->Text,fmOpenRead);
                                this->IdTCPClient1->Connect();
                                this->IdTCPClient1->WriteInteger(2,false);
                                this->IdTCPClient1->WriteInteger(this->ConHandle,false);
                                if(this->IdTCPClient1->ReadInteger(false)==256)
                                {
                                        this->IdTCPClient1->WriteLn(section.FormatString("dd.mm.yyyy hh:nn:ss"));               // Время
                                        l=this->CSpinEditArray1->Value;
                                        this->IdTCPClient1->WriteInteger(l,false);              // Передаем повторы
                                        l=this->CSpinEditArray2->Value;
                                        this->IdTCPClient1->WriteInteger(l,false);              // Передаем задержку
                                        this->IdTCPClient1->WriteInteger(int(this->CheckBoxArray1->Checked),false);          // Два скриншота
                                        this->IdTCPClient1->WriteInteger(int(this->CheckBoxArray2->Checked),false);          // Удалять печенки
                                        this->IdTCPClient1->WriteInteger(int(this->CheckBox1->Checked),false);                  // Прокся
                                        l=this->Edit4->Text.Length();
                                        this->IdTCPClient1->WriteInteger(l,false);
                                        this->IdTCPClient1->WriteLn(this->Edit4->Text);                                         // Proxy-сервер
                                        this->IdTCPClient1->WriteInteger(int(this->CSpinEdit1->Value),false);                   // Порт
                                        this->IdTCPClient1->WriteInteger(int(fs->Size),false);
                                        this->IdTCPClient1->WriteStream(fs,true,false);
                                        delete fs;
                                }
                                this->IdTCPClient1->Disconnect();
                        }
                        i=this->NewInterface->InterfaceAmount;
                }
        }
        else
        {
                ShowMessage("Соединение не установлено. Переподключитесь, пожалуйста.");
        }
}

Все параметры после времени (повторы, задержка и пр.) передаются непонятно как, то есть, вместо 1 передастся 652900, например, а вместо 2 7482350. Ошибка тоже лезет если держу соединение открытым:(. Как я только не изгалялся...
Indy 8, BCB 6.
33K
17 ноября 2010 года
hivewarrior
205 / / 16.11.2010
Если это кому-то поможет, то компилится все на Windows 7 и опыты проводятся на localhost.
Правильно передается только первая переменная после проверки на права (строки if(this->IdTCPClient1->ReadInteger(false)==256) в клиенте и AThread->Connection->WriteInteger(256,false); сервера соответственно). При этом не важно, строка это, цифра или поток. Остальное будет передано в виде какого-то бреда.
Сниффером не смог отследить, ибо etherial отказался прослушивать 127.0.0.1, в ближайшее время опробую пронюхать все в локальной сети, но сомневаюсь что что-то путевое найду.
Если не понятен код сам по себе, то там куча динмических компонентов, которые активируются динамическими радио-кнопками, собственно по этим кнопкам и определяем какие компаненты были выбраны, если кого смущает что-то типа this->CSpinEditArray2->Value. Проблема не в этом, а в сокетах от инди.
Проверялись статические константы типа 60 или 1 вместо этих страшных this->CSpinEditArray2->Value исход один.
Игрался с размерами буфера клиента и сервера, не помогло. Может, у кого была похожая ошибка? И как с этим бороться? Я уже из сил выбился...
33K
18 ноября 2010 года
hivewarrior
205 / / 16.11.2010
Спасибо большое, форум, хотя бы за моральную поддержку. Проблему решил другим путем. Переделал свой протокол немного в другую сторону, так, что он передает поток, а потом анализ этого потока соответственно.:cool:
Но тем не менее, вопрос по предыдущему коду остается открытым. Почему в середине передачи данных начинается что-то невменяемое? Вместо единичек двоек и троек передавалось милионы, милиарды и пр.?
297
18 ноября 2010 года
koodeer
1.2K / / 02.05.2009
 
Код:
s=AThread->Connection->ReadString([highlight]19[/highlight]);

 
Код:
this->IdTCPClient1->Write[highlight]Ln[/highlight](section.FormatString("[highlight]dd.mm.yyyy hh:nn:ss[/highlight]"));

Не уверен, но думаю, что остаётся несчитанным символ перевода строки. Из-за чего дальнейший ввод данных нарушается.
33K
18 ноября 2010 года
hivewarrior
205 / / 16.11.2010
Думаешь я не шаманил с числами 20, 21,22 и 18? Да и при шаманстве с ВратйЭленом было выяснено, что он фактически передает только массив char'ов без нуль-символа. А потом с другой стороны его дособирает до АнсиСтринга.
Да и писал, что не важно, какая из переменных снизу стоит, этот стринг или инт, после именно одной считанной переменный начинается мясо.
Кстати, я бы узнал символ перевода на другую строку:rolleyes:
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог