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

Вниз

Передача файла с помощью TServerSocket и TClientSocket   Найти похожие ветки 

 
Anonimus   (2003-09-19 11:27) [0]

Драсти вам..!!!!
Вот какая проблема, перед передачей файла я посылаю строку заголовка, которая содержит имя файла размер и т.д. я покапался в архивах и там написано что нужно посылать так SendBuf(@Stroka[1], SizeOf(Stroka));, но так не работает выдает ошибку, тогда
посылаю я ее так: SendBuf(Stroka[1], SizeOf(Stroka)); но проблема в том что эта строка приходит через раз, т.е. бывает что не приходит и программа приемник зацикливается....
Вообщем как быть..????
Подскажите плиз..!!!


 
Digitman ©   (2003-09-19 14:24) [1]

1. Как декларирован идентификатор Stroka ?
2. Гнездо передатчика неблокирующее ? Если да, то обрабатываешь ли событие On[Client]Write ?


 
Master   (2003-09-19 15:15) [2]

Да используй ты UDP из Indy а то опять обяснять придется буферезацию посылки. Или возми котовый компонент TCP опяттаки из Indy.


 
Verg ©   (2003-09-19 15:17) [3]


> Или возми котовый компонент TCP опяттаки из Indy.


Это "не спортивно" :)


 
Anonimus   (2003-09-22 11:13) [4]

> Digitman
Stroka декларированна как String; Гнездо неблокирующие.. и приемник организован на строне клиента....


 
Digitman ©   (2003-09-22 13:09) [5]


> Anonimus


> Stroka декларированна как String


в таком случае выражение SizeOf(Stroka) всегда равно 4 байта.
прочувствуй разницу между SizeOf(Stroka) и Length(Stroka) !!


> Гнездо неблокирующие


значит событие OnClientWrite() обязательно к обработке серверной (передающей) стороной


> приемник организован на строне клиента


надо понимать, что клиент никогда ничего не передает серверу ? передача ведется исключительно в направлении "сервер --> клиент" ?

если передача ведется в какой-то момент и в обратном направлении, то событие OnWrite() так же обязательно к обработке
клиентской (передающей) стороной


 
Anonimus   (2003-09-23 12:13) [6]

> Digitman
> в таком случае выражение SizeOf(Stroka) всегда равно 4 байта.

Да это я заметил..))))
а почему тогда во всех ваших примеров которые вы давали в форумах вы используете только SizeOf?????


 
Digitman ©   (2003-09-23 12:24) [7]

потому что в примерах в кач-ве 1-го параметра вызова SendBuf() я приводил непосредственно адрес буфера, а не адрес динамической структуры, хранящей внутри себя в т.ч. адрес буфера


 
Digitman ©   (2003-09-23 12:30) [8]

прочувствуй разницу

1.
var
buf: String;
...
SendBuf(PChar(buf)^, Length(buf));
или, что эквивалентно
SendBuf(buf[1], Length(buf));

2.
var
buf: Pointer; // или PChar или PByte или PByteArray или ....
...
SendBuf(buf^, размер_данных_на_которые_указывает_buf);

3.
var
buf: array[0..X] of SomeType;
...
SendBuf(buf, SizeOf(buf));


 
Anonimus   (2003-09-23 12:40) [9]

>потому что в примерах в кач-ве 1-го параметра вызова SendBuf() я приводил непосредственно адрес буфера, а не адрес динамической структуры, хранящей внутри себя в т.ч. адрес буфера

Дк я про это и говорю что когда я так делаю он ругается...!!!


 
Digitman ©   (2003-09-23 13:41) [10]


> когда я так делаю


как "так" ?

твой вариант

SendBuf(Stroka[1], SizeOf(Stroka)); // где Stroka: String;

не подходит ни под один из допустимых (или корректных) вариантов в посте


> Digitman © (23.09.03 12:30) [8]


адрес буфера Stroka[1] ты здесь указал (он совпадает с 1-м символом буфера строки, хранимой в структуре переменной Stroka), но почему же SizeOf() ??? разве размер строковых данных в буфере строки совпадает с размером переменной Stroka ? Это же совсем разные значения !! SizeOf(Stroka) для String-переменной Stroka всегда даст 4 байта (размер указателя на пеменную), в то время как Length(Stroka) даст тек.размер строковых данных, контролируемых внутренними структурами этой переменной, т.е. как раз то что тебе и нужно !!

SizeOf() подошел бы, например, если бы Stroka была объявлена как array[..] of чего_то_там, но уж никак не String) .. и уж тем более не дин.массив вида array of чего_то_там)

вникай ! вникай в полярную разницу объявлений тех или иных типов и реально происходящено при их использовании в данном и прочих похожих случаях ! пока в этом не разберешься досконально, дальше нет смысла двигаться - грабли будут упорно лупить тебя в одну и ту же точку))))


 
Digitman ©   (2003-09-23 14:03) [11]

Пойми, что переменные дин.типа, к каковым относятся, например, String или array of sometype, всегда представлены компилятором в памяти приложения как указатель на что-то другое, хранящее реальные данные ! а размер указателя в Win32 всегда равен 4 байта ! Их-то ты и получаешь в рез-те обращения к SizeOf(переменная дин.типа)...

в то же время метод

function SendBuf(var Buf; Count: Integer): Integer;

ожидает 1-м параметром адрес, по которому хранятся данные для передачи, 2-м - полный размер передаваемых данных, начиная с адреса, указанного 1-м параметром

если ты пишешь
SendBuf(Stroka[1], SizeOf(Stroka)),
то 1-м параметром ты передаешь не собственно адрес переменной Stroka, а адрес 1-го символа в буфере строки, которым управляет переменная Stroka. Это вполне корректно. Но ! 2-м параметром следует указать текущий размер буфера строки, каковой определяется, например, вызовом ф-ции Length(Stroka), ты же передаешь совсем иное - размер указателя, каковым представлена переменная Stroka в памяти.

Корректно было бы сделать и так тоже

SendBuf(PChar(Stroka) ^, Length(Stroka))

Здесь конструкцией PChar(Stroka) ^ ты говоришь компилятору : в кач-ве адреса буфера следует взять непоср.адрес строковых данных. Обрати внимание на оператор разыменования - ) ^ ! Он обязателен, когда речь идет о передаче чего-то (заранее неизвестного на этапе компиляции) фактическим параметром по ссылке, а не по значению.
префикс VAR как раз и предписывает компилятору ожидать ссылку, а не само значение

но, скажем, в случае

var
buf: Byte;
..
SendBuf(buf, SizeOf(buf));

все будет вполне корректно, ибо видя такую конструкцию, компилятор сгенерирует код, который в ран-тайм будет передавать 1-ым факт.параметром ИМЕННО АДРЕС переменной buf, а не ее значение. Т.е. буфером будет являться то, что лежит по адресу, совпадающему с адресом переменной buf. Соответственно и SizeOf(buf) вернет "единицу", ибо компилятор знает, что размер переменной buf (интерпретируемой нами как некий буфер передачи) равен размеру типа byte, т.е. "единице"


 
Anonimus   (2003-09-23 14:40) [12]

>Digitman Спасибо все это я понял..!!!!
но почему не работает вот так: SendBuf(@Stroka[1], SizeOf(Stroka));?????
Stroka : String;


 
Digitman ©   (2003-09-23 15:12) [13]

о боже !!!!!! я ему про фому, он мне про ерему))))))


 
mOOx_ ©   (2003-10-02 16:54) [14]

"...но почему не работает вот так: SendBuf(@Stroka[1], SizeOf(Stroka));?????..." Это уже на орех тянет после разъяснения на полтора экрана :).



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

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

Наверх




Память: 0.51 MB
Время: 0.016 c
3-89709
Дельфин
2003-11-10 14:06
2003.11.27
Создание собственных компонентов в DELPHI 6


1-89816
Dark Elf
2003-11-17 10:26
2003.11.27
Как отформатировать текст в TEdit по правому краю?


4-90166
acsoft
2003-08-18 08:02
2003.11.27
Как нарисовать кнопку на форме при помощи API?


3-89781
jazz
2003-11-06 17:47
2003.11.27
SQL Server Developer version


1-89814
TUser
2003-11-17 10:34
2003.11.27
FullScreen