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);
}
}
}
}
БИДА! Не правильно пересалаются данные. IdTCPClient/Server
Пишу клиент серверное приложение на IdTCPClient и соответственно IdTCPServer.
Все хорошо и интересно. Сначала шло как по маслу, но сейчас случилось непредвиденное. В середине работы программы сервер начинает принимать не совсем, а скорее даже совсем, не то, что ему отправляли. Проблема примерно тут.
Сервер.
Код:
Клиент.
Код:
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("Соединение не установлено. Переподключитесь, пожалуйста.");
}
}
{
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.
Правильно передается только первая переменная после проверки на права (строки if(this->IdTCPClient1->ReadInteger(false)==256) в клиенте и AThread->Connection->WriteInteger(256,false); сервера соответственно). При этом не важно, строка это, цифра или поток. Остальное будет передано в виде какого-то бреда.
Сниффером не смог отследить, ибо etherial отказался прослушивать 127.0.0.1, в ближайшее время опробую пронюхать все в локальной сети, но сомневаюсь что что-то путевое найду.
Если не понятен код сам по себе, то там куча динмических компонентов, которые активируются динамическими радио-кнопками, собственно по этим кнопкам и определяем какие компаненты были выбраны, если кого смущает что-то типа this->CSpinEditArray2->Value. Проблема не в этом, а в сокетах от инди.
Проверялись статические константы типа 60 или 1 вместо этих страшных this->CSpinEditArray2->Value исход один.
Игрался с размерами буфера клиента и сервера, не помогло. Может, у кого была похожая ошибка? И как с этим бороться? Я уже из сил выбился...
Но тем не менее, вопрос по предыдущему коду остается открытым. Почему в середине передачи данных начинается что-то невменяемое? Вместо единичек двоек и троек передавалось милионы, милиарды и пр.?
Код:
s=AThread->Connection->ReadString([highlight]19[/highlight]);
Код:
this->IdTCPClient1->Write[highlight]Ln[/highlight](section.FormatString("[highlight]dd.mm.yyyy hh:nn:ss[/highlight]"));
Не уверен, но думаю, что остаётся несчитанным символ перевода строки. Из-за чего дальнейший ввод данных нарушается.
Да и писал, что не важно, какая из переменных снизу стоит, этот стринг или инт, после именно одной считанной переменный начинается мясо.
Кстати, я бы узнал символ перевода на другую строку:rolleyes: