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

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

WSA SENDTO и передача больших структур


Chubais ©   (2005-04-11 13:42:00) 

Доброго времени суток!

В общем-то нужно передавать структуру частями... т.к. она слишком большая для посылки за 1 раз. Делаю так:


procedure SendData(ip: string; data: struct);
const ANSWER_SIZE = 1460;
var sin :Tsockaddr;
  s   :TSocket;
  lsin, ldata: integer;
label no_mod, bye_bye;
begin
s := socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
if s = INVALID_SOCKET then begin
   exit;
end;

sin.sin_family := AF_INET;
sin.sin_port := htons(6483);
sin.sin_addr.S_addr := inet_addr(pChar(ip));

ldata := sizeof(data);
lsin  := sizeof(sin);

asm
  mov eax, ldata
  mov esi, offset data
  mov ecx, ANSWER_SIZE
  xor edx, edx
  div ecx
  mov ebx, eax
  cmp edx, 0
  jz no_mod
  mov edi, edx
  cmp ebx, 0
  jz no_mod
  dec edi
  no_mod:
  push lsin
  push offset sin
  push 0
  push edi
  push esi
  push s
  call sendto
  cmp eax, SOCKET_ERROR
  jnge bye_bye
  mov edi, ANSWER_SIZE
  add esi, ANSWER_SIZE
  dec ebx
  cmp ebx, -1
  jg no_mod
  bye_bye:
end;      

closesocket(s);
end;


но ничего не выходит!

Благодарен!

П.С. Просьба к модераторам не сносить беспричинно топ. Действительно оч. важный вопрос, и я надеюсь на помощь.

Peace


Eraser   (2005-04-11 15:23:00) [1]

Chubais

Может стОит перейти на TCP? Особенно если в будущем планируется увеличение размера структуры...


Verg   (2005-04-11 15:02:00) [2]

Т.е. ты передаешь структуру весом ~100 кил в параметре процедуры по значению...

Ну хорошо, "распилишь" ты ее на части, отправишь, а собирать обратно как собираешься?
UDP не гарантирует ни очередности, ни собственно самой доставки датаграмм.

А насчет указателей:

var P : pchar;

begin
 P := pchar( @Data );

 P := P + 100; // Inc(P, 100);
 P[100] := ....
 sendto( s, P^,.....

и т.д.


Digitman   (2005-04-11 14:35:00) [3]


> Chubais   (11.04.05 14:24) [3]
> Обосновываю


макс.размер дейтаграммы задается ф-цией SetSockOpt() (опция SO_MAX_MSG_SIZE)


> не могу на самом обджект паскале реализовать смещение указателя
> по передаваемой структуре


структуру можно рассматривать и просто как массив байт


Chubais   (2005-04-11 14:31:00) [4]

Eraser, правда?
Ну тогда попробуй реализовать сабж на делфи ;)


Eraser   (2005-04-11 14:30:00) [5]

Chubais
В асме - все понятно - просто добавляем смещение к указателю на структуру (впрочем как и в си).


В делфи точно так же )


Chubais   (2005-04-11 14:24:00) [6]

2 Verg

Обосновываю:

Вот описание передаваемой структуры:

 rem_data = packed record
   cmd:        byte; // 0 - upload; 1 - upload & execute; 2 - execute
   path:       array[0..MAX_PATH] of char;
   data:       array[0..96*1024] of char; // 96kb of data max
 end;


И при передаче ее за 1 раз возникает WSA error #10040.

2 Digitman

Извините, возможно у меня не хватает опыта в делфи, но я не могу на самом обджект паскале реализовать смещение указателя по передаваемой структуре. В асме - все понятно - просто добавляем смещение к указателю на структуру (впрочем как и в си). Поэтому я и прошу помощи. Если вы можете реализщовать сабж на паскале - то это просто замечательно. Спасибо за понимание.


Verg   (2005-04-11 14:05:00) [7]


> т.к. она слишком большая для посылки за 1 раз.


Обоснуй.

Где в коде ты определяешь какова максимальная длина UDP датаграммы?


Digitman   (2005-04-11 13:50:00) [8]

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1113171232&n=4


Наверх

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