Главная страница
    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.48 MB
Время: 0.038 c
15-1232375977
SP
2009-01-19 17:39
2009.03.29
Съемный диск


2-1233477208
jonin
2009-02-01 11:33
2009.03.29
загрузка процессора


1-1208325946
hitk
2008-04-16 10:05
2009.03.29
показать scroll в ListView


15-1230126644
@!!ex
2008-12-24 16:50
2009.03.29
Lua работа с внешними классами как со своими родными


15-1232473177
saNat
2009-01-20 20:39
2009.03.29
Как разрешить вкладку "Общий доступ"?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский