Главная страница
    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.47 MB
Время: 0.763 c
1-1119695069
TW
2005-06-25 14:24
2005.07.18
Работа с TObjectList


1-1120149189
Бу
2005-06-30 20:33
2005.07.18
Графика


14-1119343954
Eugene74
2005-06-21 12:52
2005.07.18
Задача о двух цилиндрах


1-1120106993
Revers
2005-06-30 08:49
2005.07.18
RichEdit портит текстовый файл


3-1117706174
Ega23
2005-06-02 13:56
2005.07.18
Invalid BLOB handle in record buffer





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