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

Вниз

Отправка пакетов   Найти похожие ветки 

 
Maloj2007 ©   (2008-01-29 13:04) [0]

Доброго времени суток!
Подскажите как провильно можно отправить пакет?
Ниже приведен код, но почему то не работает, все отправляется, но получить не могу.
Использую 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 пустой :(


 
Сергей М. ©   (2008-01-29 13:09) [1]

Полное безобразие в коде)


 
Maloj2007 ©   (2008-01-29 13:11) [2]

Почему??? ПОдскажи плиз что подправить


 
Maloj2007 ©   (2008-01-29 13:13) [3]

Все проблема в том что может отправляться несколько видов пакетов, разного размера. Пакет вида TPackedAuth это пример


 
Maloj2007 ©   (2008-01-29 13:20) [4]

Сергей М
Подскажи плиз что изменить в коде?


 
Сергей М. ©   (2008-01-29 13:22) [5]


> что подправить


Здесь не "подправлением" пахнет, а полной переработкой кода.

Начнем объявления типов:


> TPackedAuth = ^PPackedAuth


Почему не PPackedAuth = ^TPackedAuth ?
Префиксы T и P у имен идентификаторов несут вполне обоснованную смысловую нагрузку !
А ты ее поставил с ног на голову)


> PPackedAuth = record


Где packed ? Мыши съели ?)

Дальше.


> Data:Pointer;


Зачем партнеру по коннекту твой указатель в поле Data ? Он что с ним делать-то будет по получению ?


> Client.Socket.SendBuf(


Где анализ результата вызова ?


> Socket.ReceiveBuf(


Тоже самое - где анализ результата вызова ?


 
Maloj2007 ©   (2008-01-29 13:28) [6]


> > Data:Pointer;Зачем партнеру по коннекту твой указатель
> в поле Data ? Он что с ним делать-то будет по получению
> ?

Т.е. на сколько я понимаю нужно описывать именно тип пакета?? А если типов пакетов несколько, то описывать каждый?


 
Сергей М. ©   (2008-01-29 13:33) [7]


> нужно описывать именно тип пакета?? А если типов пакетов
> несколько, то описывать каждый?
>


Это уж ты сам решай.

Но я не об этом, а о том, что передача указателя в чужое адресное пространство  в твоем случае лишено смысла.


 
Slym ©   (2008-01-29 13:35) [8]

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;


 
Slym ©   (2008-01-29 13:39) [9]

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;


 
Maloj2007 ©   (2008-01-29 13:41) [10]

Slym
Спасибо, но тут одна проблеммка, в том что типов пакетов может быть несколько, а трафик у сервера не резиновый чтоб каждый раз передавать и получать лишние данные.
Вот потому и маюсь.


 
Сергей М. ©   (2008-01-29 13:44) [11]


> трафик у сервера не резиновый


вот и начни его экономить с указания packed record


 
Maloj2007 ©   (2008-01-29 13:45) [12]

Slym
А... Вот теперь понял огромное спасибо за наводку, сейчас буду пробовать


 
Slym ©   (2008-01-29 14:08) [13]

Maloj2007 ©   (29.01.08 13:41) [10]
передавать и получать лишние

и чего я лишнего передал? ФСБ не видело и ладно :)



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

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

Наверх




Память: 0.5 MB
Время: 0.019 c
1-1208325946
hitk
2008-04-16 10:05
2009.03.29
показать scroll в ListView


15-1232645348
Кое кто
2009-01-22 20:29
2009.03.29
Серия английских фильмов


1-1208418432
Igor_34
2008-04-17 11:47
2009.03.29
WebBrowser и документ Word


9-1177600266
$00FF00
2007-04-26 19:11
2009.03.29
Проблемы с трением


1-1208419242
312kbps
2008-04-17 12:00
2009.03.29
Событие смена активного окна в винде