Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.12.2010, 13:03   #1
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию Отослать необъявленый массив сокетом

Здравствуйте, уважаемые!
Снова у меня проблема...

Есть процедура:
Код:
procedure OnSrvPacket(var pck; len: Integer); stdcall;
var
  pckf: packed record
    size: Word;
    id: Byte;
  end absolute pck;
begin
  SendPacketToClient(pck,len);// на это не смотрите, это не на сокет...
  if pckf.id = $4a then begin
    ThrSock.CLSock.Socket.SendBuf(pck[1],len);
  end;
end;
В неё приходит указатель на массив байтов и длина массива.

Нужно отослать этот массив с нужной длиной через сокет.

Но при таком исполнении как указал, компилятор ругается на то, что процедуре отправки нужен тип данных в виде массива.
Приведение типов не помогает (или привожу не правильно), код работает из библиотеки, и приложение, в котором эта библиотека обитает, вылетает с ошибкой памяти (AV).

Как правильно отослать?

ЗЫ: изначально параметры процедуры выглядели так:
(const pck; len: Integer)
Но SendBuf() ругается, что ей нельзя передавать константы....
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}

Последний раз редактировалось Johnson; 27.12.2010 в 08:04.
Johnson вне форума Ответить с цитированием
Старый 27.12.2010, 08:01   #2
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Топик ап, не ругайтесь сильно... просто очень нужна помощь...

Ни как не могу разобраться...
Вро де бы правильный вариант, но сервер всеравно принимает данные не правильные...
Код:
procedure OnSrvPacket(var pck; len: Integer); stdcall;
var
  pckf: packed record
    size: Word;
    id: Byte;
  end absolute pck;
  pcks:string;
begin
  SendPacketToClient(pck,len);
  if pckf.id = $4a then begin
    SetLength(pcks,len);
    Move(pck,pcks[1],len);
    debug('S->C: '+MemToHex(pcks[1],len,' '));
    ThrSock.CLSock.Socket.SendBuf(pcks[1],len);
  end;
end;
процедура MemToHex возвращает читаемую строку в виде хекс-значений байтов...
процедура debug записывает строку в файл.

итого в файле правильные байты данных, а сервер принимает билеберду...

в той же процедуре такой код:
Код:
var
s:string;
begin
....
s:='привет!';
ThrSock.CLSock.Socket.SendBuf(s[1],length(s));
работает нормально, сервер принимает слово правильно...

Сервер тоже принимает правильно (иначе бы не принял слово "Привет!"):
Код:
procedure TDLLInjectForm.SockClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
  pck:string;
begin
  Memo1.Lines.Add('Клиентский сокет сказал ('+IntToStr(Socket.ReceiveLength)+' байт): ');
  SetLength(pck,Socket.ReceiveLength);
  Socket.ReceiveBuf(pck[1],Socket.ReceiveLength);
  Memo1.Lines.Add( pck );
  Memo1.Lines.Add( MemToHex(pck,length(pck),' ') );
end;
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}

Последний раз редактировалось Johnson; 27.12.2010 в 10:42.
Johnson вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как сделать с сокетом cargo29 Общие вопросы Delphi 4 20.12.2010 22:02
Как отослать текст определенному клиенту. rust-02 Работа с сетью в Delphi 1 07.11.2010 11:16
Как отослать миди-сообщение на айдио-интерфейс artemvyrtosu Помощь студентам 0 14.06.2010 14:31
как отослать к примеру строку "Privet" по протоколу UDP Astron Работа с сетью в Delphi 0 16.04.2010 18:43