Форум: "Сети";
Текущий архив: 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.034 c