![]() |
|
|
|
|
#1
|
||||
|
||||
|
как в сокете при получении пакета Buf считать не определенный размер, а весь пришедший пакет
|
|
#2
|
|||
|
|||
|
вот так получишь все данные в Buf, если они не превышают 32 кб, что думаю у тебя никогда не произойдет.
Код:
var Buf: array[0..32767] of char; begin Socket.ReceiveBuf(Buf, Socket.ReceiveLength); end; Код:
for i:=1 to Socket.ReceiveLength div SizeOf(TSendStruct) P.S.: если с 9ти утра будешь в аське, помогу, потом времени не будет. P.S.2: или вообще сделать динамический массив char'ов и устанавливать ему размер от 0 до Socket.ReceiveLength (в нем и будут все твои данные которые пришли в текущий момент) Последний раз редактировалось Assistant, 23.03.2011 в 00:51. |
|
#3
|
||||
|
||||
|
эм имеешь ввиду куда выделять?
|
|
#4
|
||||
|
||||
|
вариант 1:
Код:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
len: Integer;
buf: array of Char;
i: Integer;
begin
len:=Socket.ReceiveLength;
SetLength(buf, len);
Socket.ReceiveBuf(buf[0], len);
for i:=0 to len-1 do
begin
// buf[i]
end;
end;Код:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
len: Integer;
buf: PChar;
begin
len:=Socket.ReceiveLength;
buf:=GetMemory(len);
try
Socket.ReceiveBuf(buf^, len);
// Memo1.Lines.Add(Copy(buf, 1, len));
finally
FreeMemory(buf);
end;
end; |
|
#5
|
||||
|
||||
|
спасибо,
но вот проблема Код:
var pacet: TSendStruct; begin ... ... pacet:=Copy(buf, 1, Socket.ReceiveLength); где TSendStruct = packed record как быть [Error] Main.pas(389): Incompatible types: 'TSendStruct' and 'String' |
|
#6
|
|||
|
|||
|
та ёп, яж те говорил, через TMemoryStream делай, читай в него кусок который нужен и потом через .Write пиши в структуру
|