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

Вниз

PChar по сети   Найти похожие ветки 

 
mOOx_ ©   (2003-08-10 13:53) [0]

Проблема вот в чем: есть значит PChar. На клиенте я формарую месагу в эту переменную, далее мне надо это сообщение перекинуть нежду ClientSocket и ServerSocket. Но не просто перекинуть, а в структуре следующего вида:

TPackageType = (ptMessage,ptAction);
TPackage = record
CommandType: TPackageType;
Length: LongInt;
Data: pointer;
end;

Заполнение структуры в клиенте:

GetMem(Pack,sizeof(TPackage));
Pack.CommandType:=ptMessage;
Mess:=PChar("сообщение"+#0);
Pack.Data:=Mess;
Pack.Length:=StrLen(Mess);
Socket.SendBuf(Pack^,sizeof(TPackage));
FreeMem(Pack,sizeof(TPackage));

Прием данных на сервере:

GetMem(Pack,sizeof(TPackage));
DM.SvrSock.Socket.Connections[0].ReceiveBuf(Pack^,Socket.ReceiveLength);
if Pack.CommandType=ptMessage then
begin
GetMem(Mess,Pack.Length);
Mess:=Pack.Data; <- Mess в отладчике вообще ничего не показывает
ShowMessage(Mess); ( Mess)
Проблема вот в чем: есть значит PChar. На клиенте я формарую месагу в эту переменную, далее мне надо это сообщение перекинуть нежду ClientSocket и ServerSocket. Но не просто перекинуть, а в структуре следующего вида:

TPackageType = (ptMessage,ptAction);
TPackage = record
CommandType: TPackageType;
Length: LongInt;
Data: pointer;
end;

Заполнение структуры в клиенте:

GetMem(Pack,sizeof(TPackage));
Pack.CommandType:=ptMessage;
Mess:=PChar("сообщение"+#0);
Pack.Data:=Mess;
Pack.Length:=StrLen(Mess);
Socket.SendBuf(Pack^,sizeof(TPackage));
FreeMem(Pack,sizeof(TPackage));

Прием данных на сервере:

GetMem(Pack,sizeof(TPackage));
DM.SvrSock.Socket.Connections[0].ReceiveBuf(Pack^,Socket.ReceiveLength);
if Pack.CommandType=ptMessage then
begin
GetMem(Mess,Pack.Length);
Mess:=Pack.Data; <- Mess в отладчике вообще ничего не показывает
ShowMessage(Mess); <- А тут вообще Access Violation
FreeMem(Mess);
end;
FreeMem(Pack);

Как бы так сделать, чтоб все было?


 
MBo ©   (2003-08-10 14:18) [1]

Ты пересылаешь указатель - 4 байта - в другом процессе он не имеет смысла.


 
mOOx_ ©   (2003-08-10 14:23) [2]

Точно!!! Об этом я как-то не подумал :). И как теперь тогда что?


 
panov ©   (2003-08-10 14:30) [3]

Пересылай буфер, а не указатели, вот и все.


 
mOOx_ ©   (2003-08-10 14:32) [4]

Это то я понял, тока мне обьявить что-то вроде

TPackage = record
CommandType: TPackageType;
Length: LongInt;
Data: TMemoryStream;
end;

???


 
MBo ©   (2003-08-10 14:40) [5]

Сначала передаешь заголовок, в котором указано количество байт данных, затем сами данные.


 
mOOx_ ©   (2003-08-10 14:42) [6]

Так не интересно, я так и делал, хочу все в раз передать (вот и мудрю по этому :) ). Может это не возможно, конечно...


 
SPeller ©   (2003-08-10 15:23) [7]

TMyRec = record
Len: Integer;
Buf: array[ 0..50 ] of Char;
end;

в буфер записывай своё сообщение.


 
SPeller ©   (2003-08-10 15:24) [8]

И тегу где-то забыли проставить :)))


 
panov ©   (2003-08-10 15:27) [9]


Test


 
SPeller ©   (2003-08-10 16:12) [10]

Ещё тест.


 
SPeller ©   (2003-08-10 16:13) [11]

Теперь нормально.



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

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

Наверх




Память: 0.49 MB
Время: 0.014 c
3-92013
SCORPION ZP
2003-07-30 19:20
2003.08.28
конвертация баз FoxPro в dBASE IV


4-92301
KSergey
2003-06-23 17:17
2003.08.28
Режимы координат для экрана, отличные от MM_TEXT


7-92281
msgipss
2003-06-11 10:08
2003.08.28
Программно отключить системный динамик


1-92106
VID
2003-08-14 19:29
2003.08.28
Реализация OLE Drag&Drop


14-92193
` frizZ. `
2003-08-10 19:46
2003.08.28
Задачка