Конференция "Сети" » Отправка пакетов [WinXP]
 
  • Maloj2007 © (29.01.08 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 пустой :(
  • Сергей М. © (29.01.08 13:09) [1]
    Полное безобразие в коде)
  • Maloj2007 © (29.01.08 13:11) [2]
    Почему??? ПОдскажи плиз что подправить
  • Maloj2007 © (29.01.08 13:13) [3]
    Все проблема в том что может отправляться несколько видов пакетов, разного размера. Пакет вида TPackedAuth это пример
  • Maloj2007 © (29.01.08 13:20) [4]
    Сергей М
    Подскажи плиз что изменить в коде?
  • Сергей М. © (29.01.08 13:22) [5]

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


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

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


    > TPackedAuth = ^PPackedAuth


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


    > PPackedAuth = record


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

    Дальше.


    > Data:Pointer;


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


    > Client.Socket.SendBuf(


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


    > Socket.ReceiveBuf(


    Тоже самое - где анализ результата вызова ?
  • Maloj2007 © (29.01.08 13:28) [6]

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

    Т.е. на сколько я понимаю нужно описывать именно тип пакета?? А если типов пакетов несколько, то описывать каждый?
  • Сергей М. © (29.01.08 13:33) [7]

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


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

    Но я не об этом, а о том, что передача указателя в чужое адресное пространство  в твоем случае лишено смысла.
  • Slym © (29.01.08 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 © (29.01.08 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 © (29.01.08 13:41) [10]
    Slym
    Спасибо, но тут одна проблеммка, в том что типов пакетов может быть несколько, а трафик у сервера не резиновый чтоб каждый раз передавать и получать лишние данные.
    Вот потому и маюсь.
  • Сергей М. © (29.01.08 13:44) [11]

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


    вот и начни его экономить с указания packed record
  • Maloj2007 © (29.01.08 13:45) [12]
    Slym
    А... Вот теперь понял огромное спасибо за наводку, сейчас буду пробовать
  • Slym © (29.01.08 14:08) [13]
    Maloj2007 ©   (29.01.08 13:41) [10]
    передавать и получать лишние

    и чего я лишнего передал? ФСБ не видело и ладно :)
 
Конференция "Сети" » Отправка пакетов [WinXP]
Есть новые Нет новых   [134431   +14][b:0][p:0.001]