Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.008 c
4-92294
miek
2003-06-29 10:08
2003.08.28
PerformanceTimer


3-91976
старичок
2003-08-01 11:31
2003.08.28
Помогите SQL запрос


14-92229
Proger_XP
2003-08-09 10:46
2003.08.28
Программы


3-91988
Ditrix
2003-08-06 11:38
2003.08.28
Locate в FIBDataset


3-92002
shark_mas
2003-08-05 22:46
2003.08.28
Как работать с field query?




   Наверх