Форум: "Сети";
Текущий архив: 2003.05.08;
Скачать: [xml.tar.bz2];
ВнизОпять Socket-Ы :-)))!!! Ну нихрена не работает господа!!!! Найти похожие ветки
← →
RUS1 (2003-03-12 09:48) [0]Всем привет!!!
Сервер, по кнопке:
procedure TForm1.Button3Click(Sender: TObject);
begin
ServerSocket1.Socket.Connections[0].SendBuf(Parameter,SizeOf(Parameter));
end;
Клиент:
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var L :Integer;
buf :PChar;
src :TFileStream;
begin
L:=Socket.ReceiveLength;
GetMem(buf,L);
Socket.ReceiveBuf(buf,L);
src:=TFileStream.Create("d:\tmp",fmOpenReadWrite);
src.Seek(0,soFromEnd);
src.WriteBuffer(buf,L);
src.Free;
FreeMem(buf);
end;
Результат: Acsess viol...что сделано не правильно???
Parameter - запись с массивами и строками типа String[x].
Ктонибуть ТОЛКОМ по порядку обьясните раз и навсегда как передавать данные по сокету, какие события использовать для сервера какие для клиента???
← →
Digitman (2003-03-12 09:59) [1]Socket.ReceiveBuf(buf^,L);
← →
RUS1 (2003-03-12 10:07) [2]Спасибо брат!!! Сейчас как попробую....
... да вроде получилось (стучу три раза по голове)
← →
Digitman (2003-03-12 10:16) [3]не будет все это работать как положено в условиях глоб.сети при non-blocking-режиме - нет обработки рез-та вызова SendBuf(), нет обработки OnWrite() и т.д. и т.п.
это - раз.
второе.
на строчке
src.WriteBuffer(buf,L);
ты рано или поздно получишь белиберду в принятых данных (в худ.случае - AV), ибо L = ReceiveLength() может не соответствовать реальному результату вызова ReceiveBuf() (реально ReceiveBuf() вернет меньшее значение)
см.хэлп на ReceiveLength()
← →
RUS1 (2003-03-12 11:09) [4]Да так и есть приходят не данные а полный ОТСТОЙ!!!!!
как же решить проблему????
← →
Digitman (2003-03-12 11:14) [5]
> как же решить проблему
я ему про фому , а он все - про ерему)
ты вчитался в пост от (12.03.03 10:16) ? проблески мысли хоть какие-то имеются у тебя по этому поводу ?
← →
RUS1 (2003-03-12 11:59) [6]ок. тоды такой вопрос: по какому событию сервера можно начать посылать данные клиенту, при условии не переподключения с ним в non-clock режиме тоесть: работает сервер к нему подключены слиенты, на сервер пришли данные их нужно разослать клиентам как инициировать передачу данных, другими словами вызвать событие OnClientWrite для начала пердачи данных?
← →
Digitman (2003-03-12 12:15) [7]событие On[Client]Write() возникает как минимум однократно - сразу за событием On[Client]Connect() - сигнализируя о готовности буфера передатчика к приему данных, предназначенных к пересылке.
впоследствии это событие возникает всякий раз, когда в non-blocking-режиме любой из send-методов, вызванный ранее, вернул отказ, связанный с переполнением буфера передачи (его размер по-умолчанию ~ 8кб). Событие извещает об освобождении буфера передачи (т.е. все данные, помещенные в него одним или более чем одним вызовом send-метода, успешно "вытолкнуты" в канал связи с приемником) и по факту его возникновения буфер можно наполнять снова, вызывая send-методы
← →
RUS1 (2003-03-12 12:39) [8]Уважаемый DIGITMAN ты говоришь что я не читаю что ты пишеш :-)), возможно.... но как я погляжу ты тоже не сильно внимательно читаеш что я пишу... :-)) про буферы я уже начитался из прошлых конференций (твое творчество спасибо), но сейчас я спрашиваю КАК вызвать ети событие для передачи данных On[Client]Write() НЕ отключаясь от клиента!!!! тоесть событие Connect прошло уже давно!!!! и предыдущий пакет данных уже тоже давно отослан и забыт ... но вот пришли новые данные на сервер и как их посылать если напрямую в non-clock режиме метод ServerSocket1.Socket.Connections[0].SendBuf(Parameter,SizeOf(Parameter)) не работает??? вот в чем вопрос!!!
← →
Digitman (2003-03-12 12:50) [9]
> в non-clock режиме
что еще за режим такой ? 2-й раз упоминаешь уже ! не знаю я такого
> метод ServerSocket1.Socket.Connections[0].SendBuf(Parameter,SizeOf(Parameter))
> не работает??? вот в чем вопрос!!!
Не работает у тебя, видимо, голова, а не этот вызов ! Я тебе в который раз уже говорю, что это - ФУНКЦИЯ !!! И у нее есть результат. И в хэлпе достаточно понятно описано, как реагировать на тот или иной результат, в т.ч. в привязке к событию OnWrite()
Никакой результат вызова, как видно из твоего кода , тебя не интересует вовсе, тебе на него ровным счетом плевать, поскольку вызываешь ты этот метод как процедурный, а не функциональный - вызвал его и хрен с ним, нехай сам там разбирается).
Что ж удивляться-то после этого, коль не работает передатчик как положено ?
А событие никак не вызвать. Я тебе только что объяснил, что оно возбуждается компонентом при опред. условиях. Вчитайся в эти условия !
← →
Digitman (2003-03-12 12:59) [10]а если уж тебя приспичило вызвать ОБРАБОТЧИК события, то делается это точно так же, как и вызов любого другого метода объекта
procedure TMyForm.MyServerClientWrite(Sender: TObject; Socket: TCustomWinSocket);
begin
.. вызов Send-метода
end;
...
MyServerClientWrite(MyServerSocket, SomeActiveConnection);
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2003.05.08;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c