![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как граматно отправлять и принимать данные через сокеты? [D7, WinXP]
@Ujin © (2004-04-09 22:04:00)Вот, пробую сделать так:
type
PCmdHeader = ^TCmdHeader;
TCmdHeader = record
BufferSize: Integer;
Cmd: Integer;
end;
...
// Это кнопочка Send...
procedure TForm2.Button1Click(Sender: TObject);
var cmdh: TCmdHeader;
Data: PChar;
begin
Clt.Active := true;
cmdh.Cmd := StrToInt(Edit2.Text);
Data := PChar(Edit1.Text);
cmdh.BufferSize := SizeOf(Data);
cmdh.Data := Data;
if Clt.Connect then begin
Clt.SendBuf(cmdh, SizeOf(cmdh));
Clt.SendBuf(Data, SizeOf(Data));
end;
Clt.Active := false;
end;
procedure TForm2.SrvAccept(Sender: TObject; ClientSocket: TCustomIpClient);
var cmdh: TCmdHeader;
Data: PChar;
begin
Application.ProcessMessages;
ClientSocket.ReceiveBuf(cmdh, SizeOf(cmdh));
GetMem(Data, cmdh.BufferSize);
ClientSocket.ReceiveBuf(Data, cmdh.BufferSize);
case cmdh.Cmd of
1: Memo1.Lines.Add(Data);
2: Caption := PChar(Data);
end;
end;
Почему, данные то проходят, то не проходят??? Очень грустен... Чувствую, что ответ прост, но уже убил часа 4... :(
TButton (2004-04-10 23:31:00) [1]3
согласен. но не всегда.
Gott (2004-04-10 23:27:00) [2]Проще всего пересылать данные как текст и использовать для обмена данными ТОЛЬКОсобытия OnXXXXRead & OnXXXXWrite. Для отправки использовать SendText.
Verg (2004-04-10 10:52:00) [3]Как бы еще догадаться в каком режиме используется Clt.
cmdh.Data := Data;
У TCmdHeader нет поля Data. Этот код в принципе даже скомпилироваться не может.
Переменные типа pchar - по смыслу это просто указатель на область памяти. Отличается только разрешенными на этом типе указателей арифметическими операциями друг с другом и с целочисленными типами, индексированием и автоматическим переписыванием той области памяти, на которую они указывают в string с автоматическим определением размера по признаку "до первого #0"
var
A : pchar;
S : string;
L : cardinal;
....
Так вот.
S := A;
автоматически заменяется компилятором на по смыслу подобное
L := StrLen(A);
SetLength(S, L);
move(A^, S[1], L);
Вот теперь подумай - что ты там пытаешься передать и зачем?
TButton (2004-04-09 23:48:00) [4]1. грам отно
2. не знаю =)