Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Мастера ПОМОГИТЕ!!! [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));


Наверх

Титульная страница Поиск, карта сайта Написать письмо