Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SendStream [D6]


Vitalik ©   (2003-10-23 11:26:00) 

Здравствуйте!
У меня проблема с TClientSocket/TServerSocket!
Я ни как не могу послать из TClientSocket данные в TMemoryStream и не могу принять их в TServerSocket.

отсылаю данные так:
ClientSocket.port:=20000;
ClientSocket.ClientType:=ctBlocking;

***
var
strm: TMemoryStream;
d: integer;
begin
d:=123;
strm:=tmemoryStream.create;
strm.write(d, SizeOf(d) );
ClientSocket.Socket.SendStream(Strm);
end;

Ну тут вроде всё получается, т.е. никаких ошибок.

принимаю данные так:

ServerSocket.port:=20000;
ServerSocket.ServerType:=stNonBlocking;

***

Ну в общем, первый вопроос: а какое, событие нужно обрабатывать, чтобы получить этот поток данных? Например, OnClientRead не срабатывает. А вообще, получать эти данные нужно примерно так?:

ServerSocket.Socket.ReceiveBuf...
?

Вот.
Либо у это я что-то не так делаю, что у меня OnCLientRead не срабатывает (ведь когда отсылаешь данные ч/з SendText или SendBuf, то оно же срабатывает), либо его нужно как-тоо по-другому получать?!!

У меня более или менее получается получать и принимать текст и буферы, а вот со Stream ника...

Спасибо!


Vitalik   (2003-10-23 19:30:00) [1]

Ну понятно ;)
Спасибо за науку :)
Извините за испорченные нервы :)


Digitman   (2003-10-23 14:43:00) [2]


> Polevi


думаешь, у меня их много, сил-то ?)
тоже не предел есть)

тотальное и печальное незнание Паскаля( ...


> Vitalik



> FreeMem(buf); //Вот тут у меня происходит ошибка Access
> violation... Почему?


потому что ты даже не удосужился взглянуть на декларацию ф-ции ReceiveBuf()

а она в твоем случае требует для передачи в кач-ве факт.параметра адреса буфера именно адрес буфера, а не адрес переменной, хранящей адрес буфера !

разыменование нужно !

Socket.ReceiveBuf(buf ^, l);


Polevi   (2003-10-23 14:40:00) [3]

вот к примеру
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1064824067&n=4


Polevi   (2003-10-23 14:33:00) [4]

сил больше нет объяснять одно и тоже, поищи в этом разделе форума по слову Digitman - тебе будет полезно почитать


Vitalik   (2003-10-23 13:51:00) [5]

Спасибо, Polevi! Действительно, теперь данные передаются. Но у меня возникли некоторые проблемы при получении данных...

Обрабатываем событие ClientRead:
procedure TForm1.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
l: Integer;
buf: PChar;
d: integer;
begin
l:=Socket.ReceiveLength;
getmem(buf, l);
Socket.ReceiveBuf(buf, l);
d:=Integer(buf);
ListBox1.Items.Insert(0, format("пришло байт=%d; данные=%d", [l, d]));
FreeMem(buf); //Вот тут у меня происходит ошибка Access violation... Почему?

end;

Т.е. данные, то получаю нормально, но вот ошибка почему происходит?


Polevi   (2003-10-23 11:33:00) [6]

strm.Position:=0;


Наверх

Титульная страница Поиск, карта сайта Написать письмо