Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отправка пакетов [WinXP]


Maloj2007 ©   (2008-01-29 13:04:00) 

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


Slym   (2008-01-29 14:08:00) [1]

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

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


Maloj2007   (2008-01-29 13:45:00) [2]

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


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


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


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


Maloj2007   (2008-01-29 13:41:00) [4]

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


Slym   (2008-01-29 13:39:00) [5]

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   (2008-01-29 13:35:00) [6]

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;


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


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


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

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


Maloj2007   (2008-01-29 13:28:00) [8]


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

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


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


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


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

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


> TPackedAuth = ^ PPackedAuth


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


> PPackedAuth = record


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

Дальше.


> Data:Pointer;


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


> Client.Socket.SendBuf(


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


> Socket.ReceiveBuf(


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


Maloj2007   (2008-01-29 13:20:00) [10]

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


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

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


Maloj2007   (2008-01-29 13:11:00) [12]

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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо