Главная страница
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
6-92147
Sheng
2003-06-19 11:44
2003.08.28
Обмен данными по локальной сети


3-92071
Max_
2003-08-01 16:42
2003.08.28
Oracle+BDE+install


6-92164
Lamer111
2003-06-21 00:19
2003.08.28
чат и интернет


14-92222
Buka
2003-08-10 07:28
2003.08.28
Порекомендуйте учебник..


3-92067
syte_ser78
2003-07-30 22:44
2003.08.28
Запись в DBGrib