Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.18;
Скачать: CL | DM;

Вниз

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

 
Chubais   (2005-04-11 13:42) [0]

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

В общем-то нужно передавать структуру частями... т.к. она слишком большая для посылки за 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


 
Digitman ©   (2005-04-11 13:50) [1]

http://delphimaster.net/view/6-1113171232/


 
Verg ©   (2005-04-11 14:05) [2]


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


Обоснуй.

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


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

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

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


 
Eraser ©   (2005-04-11 14:30) [4]

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


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


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

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


 
Digitman ©   (2005-04-11 14:35) [6]


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


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


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


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


 
Verg ©   (2005-04-11 15:02) [7]

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

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

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

var P : pchar;

begin
 P := pchar( @Data );

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

и т.д.


 
Eraser ©   (2005-04-11 15:23) [8]

Chubais

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



Страницы: 1 вся ветка

Текущий архив: 2005.07.18;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.052 c
14-1119367733
GanibalLector
2005-06-21 19:28
2005.07.18
Теперь и Я инженер ;)


1-1120330054
n0p
2005-07-02 22:47
2005.07.18
Маленький баг...


1-1120328652
heady
2005-07-02 22:24
2005.07.18
ShowModal уже открытое окно


1-1119909456
grol
2005-06-28 01:57
2005.07.18
Ошибка после закрытия программы!!!


3-1118300903
Антоныч
2005-06-09 11:08
2005.07.18
Запрос в БД Access, защищенную паролем