TServerSocket TClientSocket в FireMonkey

kaskas
Дата: 23.06.2015 09:06:37
Здравствуйте
Мне нужно организовать обмен массивами типа unsigned char между приложением и контроллером через Ethernet. То есть "в сети" будет всегда 1 клиент и 1 сервер.
Столкнулся со следующей проблемой:
При создании приложения на VCL для передачи массивов типа char пользовался указанными в названии темы компонентами
ServerSocket1->Socket->Connections[0]->SendBuf(Message,MessLenght)
void __fastcall TfrmMain::ServerSocket1ClientRead(TObject *Sender, TCustomWinSocket *Socket)
{
RecLenght = Socket->ReceiveLength();
Socket->ReceiveBuf(RecBuffer,RecLenght);
}

Сейчас пишу аналогичное приложение на FireMonkey, и тут указанных компонентов нет.. Попробовал заморочиться с Indy (IdCmdTCPServer1, IdCmdTCPClient1) - пока получается только отправить/получить String, и то как-то неудобно и муторно..
MyContext->Connection->IOHandler->WriteLn("lala");
AContext->Connection->IOHandler->ReadLn();


Попробовал через TcpClient1... От клиента серверу строка уходит, от сервера клиенту - нет.. (для начала строку хотя бы стараюсь ловить)
TcpClient1->Sendln("1223"); //работает
TcpServer1->Sendln("asd"); //не работает


Подскажите пожалуйста, есть ли "заменитель" TServerSocket TClientSocket в FireMonkey? Или может чем ещё можно решить мою задачу.. Или хоть как это сделать через Indy?..

Заранее спасибо!
MasterZiv
Дата: 23.06.2015 11:37:54
kaskas,

в С есть просто socket api, в win winsocks.

когда пишут на С, их и используют, а если ты хочешь писать как на дельфи, я только могу тебя перекинуть в форум по дельфи.
kaskas
Дата: 24.06.2015 03:27:29
не надо меня никуда отправлять пожалуйста=) хотя бы пока;)

а можно подробнее, как что пишется на C++? Какую компоненту надо на форму кинуть и какой метод задействовать хотя бы.. Обязательно, чтоб на vcl не завязано было.
egorych
Дата: 24.06.2015 09:17:52
kaskas
Какую компоненту надо на форму кинуть.. Обязательно, чтоб на vcl не завязано было.
это неразрешимое противоречие. Либо компонент на форму, либо чтоб на vcl не было завязано.
MasterZiv
Дата: 24.06.2015 12:36:23
kaskas
не надо меня никуда отправлять пожалуйста=) хотя бы пока;)

а можно подробнее, как что пишется на C++? Какую компоненту надо на форму кинуть и какой метод задействовать хотя бы.. Обязательно, чтоб на vcl не завязано было.


примеры серверов и клиентов tcp/upd от CMU
ещё один клиент
kaskas
Дата: 25.06.2015 03:12:30
egorych, при всем уважении, думаю вы ошибаетесь...

MasterZiv, спасибо огромное! Изучаю..
kaskas
Дата: 25.06.2015 05:56:26
Ничего не получается.. Описанных в этих юнитах инклудов у меня по умолчанию не нашлось. Поискал заголовочные файлы просто на ПК - нашлось по несколько разноразмерных копий.. Попытался их подсунуть - rad_studio стал ругаться на заголовочные файлы внутри этих свежедобытых заголовочных файлов, которых в свою очередь тоже несколько... в общем тупик :(
m_Sla
Дата: 25.06.2015 06:45:22
В 6 билдере у Indy кроме WriteLn, ReadLn есть ReadBuffer и WriteBuffer.
kaskas
Дата: 25.06.2015 08:00:53
извиняюсь, что не написал сразу.. Пишу на Embarcadero RAD Studio XE3. Полагаю, там другая версия Indy, потому что все, что выдает Indy - на скриншоте http://s019.radikal.ru/i632/1506/24/3bd51e123087.jpg . И там нет этих замечательных методов:(
kaskas
Дата: 25.06.2015 08:02:50
Что получилось в итоге
unsigned char MessageToController[12];
/*заполняем MessageToController*/
TMemoryStream *t = new TMemoryStream;
// t->SetSize(12);
// t->Clear();
t->Write(MessageToController, 12);
t->Position = 0;
IdCmdTCPClient1->Socket->WriteBufferClear();
IdCmdTCPClient1->Socket->WriteBufferOpen();
IdCmdTCPClient1->Socket->Write(t,12,true);
IdCmdTCPClient1->Socket->WriteBufferClose();
delete t;

все отсылается, wireshark тому свидетель, но почему-то добавляется 4 байта перед моим массивом (00 00 00 0С), видимо длина посылки. И я так полагаю именно из за этой приставки сервер меня отключает, и я получаю 10054 ошибку. Можно ли префикс этот убрать как-то?