-
Доброго времени суток!
Подскажите как провильно можно отправить пакет?
Ниже приведен код, но почему то не работает, все отправляется, но получить не могу.
Использую CodeGear 2007 и Компоненты TServerSocked/TClientSocked
На клиенте:
type
TPackedAuth = ^PPackedAuth;
PPackedAuth = record
UIN:string[6];
Password:String[32];
end;
TPacked = ^PPacked;
PPacked = packed record
CMD:Byte;
Data:Pointer;
end;
.....
procedure TClientAuthForm.AuthClick(Sender: TObject);
var
SendPacked:TPacked;
Auth:TPackedAuth;
begin
GetMem(Auth,SizeOf(PPackedAuth));
Auth.UIN:=UIN.Text;
Auth.Password:=MD5Print(MD5String(Password.Text));
GetMem(SendPacked,SizeOf(PPacked));
SendPacked.CMD:=10;
SendPacked.Data:=Auth;
Client.Socket.SendBuf(SendPacked^,SizeOf(PPackedAuth)+SizeOf(PPacked));
end;
На сервере
type
TPackedAuth = ^PPackedAuth;
PPackedAuth = record
UIN:string[6];
Password:String[32];
end;
TPacked = ^PPacked;
PPacked = packed record
CMD:Byte;
Data:Pointer;
end;
.....
procedure TServerForm.ServerClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
GetMem(ReadPacked,2048);
Socket.ReceiveBuf(ReadPacked^,2048);
if ReadPacked.CMD=10 then
begin
GetMem(Auth,SizeOf(PPackedAuth));
Auth:=ReadPacked.Data;
end;
Данные в пакете ReadPacked верные, но пакет Auth пустой :( -
Сергей М. © (29.01.08 13:09) [1]Полное безобразие в коде)
-
Почему??? ПОдскажи плиз что подправить
-
Все проблема в том что может отправляться несколько видов пакетов, разного размера. Пакет вида TPackedAuth это пример
-
Сергей М
Подскажи плиз что изменить в коде? -
Сергей М. © (29.01.08 13:22) [5]
> что подправить
Здесь не "подправлением" пахнет, а полной переработкой кода.
Начнем объявления типов:
> TPackedAuth = ^PPackedAuth
Почему не PPackedAuth = ^TPackedAuth ?
Префиксы T и P у имен идентификаторов несут вполне обоснованную смысловую нагрузку !
А ты ее поставил с ног на голову)
> PPackedAuth = record
Где packed ? Мыши съели ?)
Дальше.
> Data:Pointer;
Зачем партнеру по коннекту твой указатель в поле Data ? Он что с ним делать-то будет по получению ?
> Client.Socket.SendBuf(
Где анализ результата вызова ?
> Socket.ReceiveBuf(
Тоже самое - где анализ результата вызова ? -
> > Data:Pointer;Зачем партнеру по коннекту твой указатель
> в поле Data ? Он что с ним делать-то будет по получению
> ?
Т.е. на сколько я понимаю нужно описывать именно тип пакета?? А если типов пакетов несколько, то описывать каждый? -
Сергей М. © (29.01.08 13:33) [7]
> нужно описывать именно тип пакета?? А если типов пакетов
> несколько, то описывать каждый?
>
Это уж ты сам решай.
Но я не об этом, а о том, что передача указателя в чужое адресное пространство в твоем случае лишено смысла. -
type
TPackedAuth = packed record
CMD:Byte;
UIN:array[0..5] of char;
Password:array[0..31] of char;
end;
var
Auth:TPackedAuth;
begin
Auth.CMD:=10;
StrLCopy(Auth.UIN,PChar(UIN.Text),SizeOf(Auth.UIN));
StrLCopy(Auth.Password,PChar(MD5Print(MD5String(Password.Text))),SizeOf(Auth.Pas sword));
Client.Socket.SendBuf(Auth,SizeOf(Auth));
end; -
type
TPackedAuth = packed record
UIN:array[0..5] of char;
Password:array[0..31] of char;
end;
var CMD:Byte;
Auth:TPackedAuth;
begin
Socket.ReceiveBuf(CMD,SizeOf(CMD));
if CMD=10 then
Socket.ReceiveBuf(Auth,SizeOf(Auth));
end; -
Slym
Спасибо, но тут одна проблеммка, в том что типов пакетов может быть несколько, а трафик у сервера не резиновый чтоб каждый раз передавать и получать лишние данные.
Вот потому и маюсь. -
Сергей М. © (29.01.08 13:44) [11]
> трафик у сервера не резиновый
вот и начни его экономить с указания packed record -
Slym
А... Вот теперь понял огромное спасибо за наводку, сейчас буду пробовать -
Maloj2007 © (29.01.08 13:41) [10]
передавать и получать лишние
и чего я лишнего передал? ФСБ не видело и ладно :)