Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.06.06;
Скачать: CL | DM;

Вниз

Мастера ПОМОГИТЕ!!!   Найти похожие ветки 

 
elefant   (2002-04-01 14:20) [0]

Как пересылать через сокеты сложнае
данные типа Record?
Пожалуйсто если можно то с кодом(лучше с исходником).


 
Digitman ©   (2002-04-01 15:03) [1]


type
TMyRecord = packed record
...
end;

var
MyRecord: TMyRecord;

...

Socket.SendBuf(MyRecord, SizeOf(MyRecord));



 
elefant   (2002-04-02 08:56) [2]

Digitman
Так то оно отправляет без крика,
Но получаю я белеберду какую-то.
Совсем не то что отправил.:<

Если кто иожет помогите кодом и сервера и клиента.


 
Reindeer Moss Eater   (2002-04-02 09:01) [3]

Socket.SendBuff(MyRecord^,SizeOf(MyRecord));


 
elefant   (2002-04-02 09:56) [4]

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 10:17) [5]

>elefant
Ты просто неправильно читаешь правильно переданный блок, а заодно еще и затираешь свою память.


 
elefant   (2002-04-02 10:25) [6]

Reindeer Moss Eater
Будь добр объясни подробнее пожалуисто.
Зарание благодарен.


 
Digitman ©   (2002-04-02 10:26) [7]

>Reindeer Moss Eater
вот это
Socket.SendBuff(MyRecord^,SizeOf(MyRecord));
работать не будет

>elefant

правильно ! "белеберду" и получишь, потому как при передаче полей
Text : String;
Caption : String;
фактически передается не буфер строки, а адрес (4 байта) управляющей структыры строки, динамически распределенной в памяти.

Самое простое решение - используй
Text : String[размер];
Caption : String[размер];



 
elefant   (2002-04-02 10:45) [8]

Digitman
Спасибо попробую.


 
elefant   (2002-04-02 10:56) [9]

Digitman
Я ограничил строку как ты советовал,
но проблема осталась.
заголовок окна меняется но не на Text, а на "".
В чем может быть проблема?


 
Digitman ©   (2002-04-02 12:52) [10]

А где строчка, в которой ты на стороне передатчика буфер передачи (data: TData) заполняешь ? единственное место, где ты пытался это сделать (судя по приведенному фрагменту), закомментарено.

Это - раз.
И второе (даже - более важное). Вчитайся в хэлп к событию сервера ClientWrite(). оно возникает совершенно по иному поводу, нежели ты себе представляешь ! Данные от клиента необходимо принимать в событии ClientRead()


 
VuDZ ©   (2002-04-02 13:04) [11]

раз это раздел про winAPI - предствь что ты сохраняешь/загружаешь файл - просто пиши в буфер постепенно все данные, для строк - первым их размер, т.е. как в файл


 
elefant   (2002-04-02 16:25) [12]

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;


--------------------------



 
elefant   (2002-04-02 16:48) [13]

Digitman

И еще когда я код пишу в onClientWrite() - вобще ничего не
происходит.


 
Digitman ©   (2002-04-02 16:52) [14]

если внес те исправления , которые я порекомендовал (string[] и перенос кода из onClientWrite() в OnClientRead()), то, вроде бы, все правильно и должно работать.

onClientWrite() - а что, по-твоему, должно происходить ? и какой факт , по-твоему, фиксирует возникновение этого события на сервере ?


 
elefant   (2002-04-03 11:13) [15]

Спасибо.
Теперь все работает.



Страницы: 1 вся ветка

Текущий архив: 2002.06.06;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.015 c
1-17961
niko4615
2002-05-28 10:08
2002.06.06
TReeview


1-18012
Val
2002-05-24 12:57
2002.06.06
Логарифм по основанию


4-18186
Blast
2002-04-04 12:46
2002.06.06
Окошко в TaskBarе


4-18177
Керик
2002-03-31 07:48
2002.06.06
Перехват сообщения приложению


14-18153
Pat
2002-05-04 00:30
2002.06.06
Hint в Delphi6