![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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