![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Мастера ПОМОГИТЕ!!! [D6]
elefant © (2002-04-01 14:20:00)Как пересылать через сокеты сложнае
данные типа Record?
Пожалуйсто если можно то с кодом(лучше с исходником).
elefant (2002-04-03 11:13:00) [1]Спасибо.
Теперь все работает.
Digitman (2002-04-02 16:52:00) [2]если внес те исправления , которые я порекомендовал (string[] и перенос кода из onClientWrite() в OnClientRead()), то, вроде бы, все правильно и должно работать.
onClientWrite() - а что, по-твоему, должно происходить ? и какой факт , по-твоему, фиксирует возникновение этого события на сервере ?
elefant (2002-04-02 16:48:00) [3]Digitman
И еще когда я код пишу в onClientWrite() - вобще ничего не
происходит.
elefant (2002-04-02 16:25:00) [4]Digitman
Пожалуйсто, вот он:
------------ Клиент -------------
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
data :TData;
function But : TMsgDlgButtons;
begin
if rbok.Checked then
result := [mbOk];
if rbAbortIgnore.Checked then
result := [mbAbort,mbIgnore];
if rbAbortRetryIgnore.Checked then
result := [mbAbort,mbRetry,mbIgnore];
if rbOKCancel.Checked then
result := [mbOK,mbCancel];
if rbYesAllNoAllCancel.Checked then
result := mbYesAllNoAllCancel;
if rbYesNoCancel.Checked then
result := [mbYes,mbNo,mbCancel];
end;
function ic : TMsgDlgType;
begin
if rbError.Checked then
result := mtError;
if rbConfirmation.Checked then
result := mtConfirmation;
if rbCustom.Checked then
result := mtCustom;
if rbInformation.Checked then
result := mtInformation;
if rbWarning.Checked then
result := mtWarning;
end;
begin
data.Text := edText.Text;
data.Caption := edcap.Text;
data.Button := but;
data.Icon := ic;
cs.Host := edHost.Text;
try
cs.Active := true;
except
exit;
end;
cs.Socket.SendBuf(data,sizeof(Tdata));
cs.Active := false;
end;
--------------------------
VuDZ (2002-04-02 13:04:00) [5]раз это раздел про winAPI - предствь что ты сохраняешь/загружаешь файл - просто пиши в буфер постепенно все данные, для строк - первым их размер, т.е. как в файл
Digitman (2002-04-02 12:52:00) [6]А где строчка, в которой ты на стороне передатчика буфер передачи (data: TData) заполняешь ? единственное место, где ты пытался это сделать (судя по приведенному фрагменту), закомментарено.
Это - раз.
И второе (даже - более важное). Вчитайся в хэлп к событию сервера ClientWrite(). оно возникает совершенно по иному поводу, нежели ты себе представляешь ! Данные от клиента необходимо принимать в событии ClientRead()
elefant (2002-04-02 10:56:00) [7]Digitman
Я ограничил строку как ты советовал,
но проблема осталась.
заголовок окна меняется но не на Text, а на "".
В чем может быть проблема?
elefant (2002-04-02 10:45:00) [8]Digitman
Спасибо попробую.
Digitman (2002-04-02 10:26:00) [9]>Reindeer Moss Eater
вот это
Socket.SendBuff(MyRecord^,SizeOf(MyRecord));
работать не будет
>elefant
правильно ! "белеберду" и получишь, потому как при передаче полей
Text : String;
Caption : String;
фактически передается не буфер строки, а адрес (4 байта) управляющей структыры строки, динамически распределенной в памяти.
Самое простое решение - используй
Text : String[размер];
Caption : String[размер];
elefant (2002-04-02 10:25:00) [10]Reindeer Moss Eater
Будь добр объясни подробнее пожалуисто.
Зарание благодарен.
Reindeer Moss Eater (2002-04-02 10:17:00) [11]>elefant
Ты просто неправильно читаешь правильно переданный блок, а заодно еще и затираешь свою память.
elefant (2002-04-02 09:56:00) [12]Reindeer Moss Eater
Ни чего подобного. Не получается.
Мастера посмотрите код может че наидете :
--- клиент ---
-------------------------
type
TData = Packed Record
Mess_tip : byte;
Button : TMsgDlgButtons;
Icon : TMsgDlgType;
Text : String;
Caption : String;
end;
var
Form1: TForm1;
data : TData;
-----------------------
cs.Host := edHost.Text;
try
cs.Active := true;
except
exit;
end;
// str := TWinSocketStream.Create(Socket,60000);
// str.WriteBuffer(data,50000);
cs.Socket.SendBuf(data,sizeof(Tdata));
cs.Active := false;
end;
-------------------------
end.
---- сервер -----
-------------------------------
type
TData = packed Record
Mess_tip : byte;
Button : TMsgDlgButtons;
Icon : TMsgDlgType;
Text : String;
Caption : String;
end;
-------------------------------
procedure TForm1.ssClientWrite(Sender: TObject; Socket: TCustomWinSocket);
var
data : Tdata;
begin
socket.ReceiveBuf(data,sizeof(tdata));
form1.Caption := data.Text;
end;
-------------------------------
end.
Reindeer Moss Eater (2002-04-02 09:01:00) [13]Socket.SendBuff(MyRecord^,SizeOf(MyRecord));
elefant (2002-04-02 08:56:00) [14]Digitman
Так то оно отправляет без крика,
Но получаю я белеберду какую-то.
Совсем не то что отправил.:<
Если кто иожет помогите кодом и сервера и клиента.
Digitman (2002-04-01 15:03:00) [15]
type
TMyRecord = packed record
...
end;
var
MyRecord: TMyRecord;
...
Socket.SendBuf(MyRecord, SizeOf(MyRecord));