Форум: "Сети";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
ВнизПередача TStream Найти похожие ветки
← →
Mr © (2004-11-15 07:49) [0]Здраствуйте .....
Пишу вот такой сервер ...
procedure TServerThread.ClientExecute;
var
Stream : TWinSocketStream;
Buffer : array[0 .. 25] of Char;
StreamSize: int64;
PacketStream: TMemoryStream;
begin
while (not Terminated) and ClientSocket.Connected do
begin
try
Stream := TWinSocketStream.Create(ClientSocket, 10000);
try
FillChar(Buffer, SizeOf(Buffer), 0);
if Stream.WaitForData(10000) then
begin
Stream.Read(Buffer, SizeOf(Buffer));
if Buffer="Get" then
begin
PacketStream:=TMemoryStream.Create;
DM.Query.Open;
DM.ClientDataSet.Open;
DM.ClientDataSet.SaveToStream(PacketStream);
StreamSize:=PacketStream.Size;
Stream.Write(StreamSize,SizeOf(StreamSize));
PacketStream.Position:=0;
Stream.Write(PacketStream,StreamSize);
end;
end
else
ClientSocket.Close;
finally
Stream.Free;
end;
except
HandleException;
end;
end;
end;
И вот такой клиент....
procedure TDM.LoadTable;
var
Stream : TWinSocketStream;
Buffer : array[0 .. 25] of Char;
PacketStream: TMemoryStream;
StreamSize:int64;
begin
frMain.ClientSocket.Address:="192.168.11.163";
frMain.ClientSocket.Port:=8000;
frMain.ClientSocket.Open;
Stream := TWinSocketStream.Create(frMain.ClientSocket.Socket, 10000);
FillChar(Buffer, SizeOf(Buffer), 0);
Buffer:="Get";
Stream.Write(Buffer,SizeOf(Buffer));
if Stream.WaitForData(30000) then
begin
Stream.Read(StreamSize,SizeOf(StreamSize));
end;
if Stream.WaitForData(30000) then
begin
PacketStream:=TMemoryStream.Create;
Stream.Read(PacketStream,StreamSize);
PacketStream.Position:=0;
ClientDataSet.LoadFromStream(PacketStream);
ClientDataSet.Open;
end;
frMain.ClientSocket.Close;
end;
При попытке выполнения следующих строчек кода:
PacketStream.Position:=0;
ClientDataSet.LoadFromStream(PacketStream);
Возникает ошибка:
Access violation at address XXXXXXXX in module "aaaaaaaaa"
Подскажите в чем я не прав ...
← →
Verg © (2004-11-15 08:20) [1]
> Подскажите в чем я не прав ...
В первую очередь вот в этом:
> Stream.Read(PacketStream,StreamSize);
Тут ты благополучно портишь сам PacketStream да и вообще стек.
Из-за этого же ты и передаешь не то, что нужно.
И в целом прием-передача сделаны неверно.
Нпример, прием:
Stream.Read не обязан читать весь streamsize. Read - это ф-ция, результатом которой является число прочитанных (принятых) байтов.
P : pchar;
LoadedSize : cardinal;
Readed : integer;
packetStream.SetSize(StreamSize);
P := PacketStream.Memory;
LoadedSize :=0;
while LoadedSize < StreamSize do
begin
Readed := Stream.Read(P[LoadedSize], StreamSize - LoadedSize);
if Readed <= 0 then
begin
break;
end;
Inc( LoadedSize, Readed );
end;
if Readed < 0 then
raise exception Create( SysErrorMessage(WSAGetLastError) )
else if Readed = 0 then
// Произошел разрыв соединения, либо истек таймаут
else begin
// Все, прием завершен нормально
end;
← →
Mr © (2004-11-15 19:56) [2]Спасибо ..............
Я пытался по примеру сделать, видать пример не удачный...
А может кто даст ссылочку на правельный пример, был бы очень благодарен ...
← →
Piter © (2004-11-15 22:25) [3]А то, что Verg написал не судьба почитать и осмыслить?
Или нужен готовый пример? Тогда $10 и я подписываюсь
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.039 c