![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отправка пакетов [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]Полное безобразие в коде)