Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.035 c
1-1119943500
Asker
2005-06-28 11:25
2005.07.18
скачать файл из инета ...


4-1116664200
seregka
2005-05-21 12:30
2005.07.18
Как получить координаты положения курсора


4-1116942710
Aleksandr.
2005-05-24 17:51
2005.07.18
Будет ли работать PostMessage из dll?


4-1117027830
Marser
2005-05-25 17:30
2005.07.18
GUI на WinAPI


1-1120146858
MY
2005-06-30 19:54
2005.07.18
Edit





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский