Текущий архив: 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