![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите Мазуту!
Мазут Береговой © (2002-11-01 07:16:00)Здрасте.
Кто знает, почему не принимаются данные и не срабатывает событие?
Ход мыслей такой:
type TSocketNotifyEvent = procedure (Sender: TObject; Socket: TCustomWinSocket) of object;
type
TDNS = class(TComponent)
...........................
procedure TDNS.SendQuery;
var Buff : TABuffer;
Len : integer;
Socket : TCustomWinSocket;
begin
...................................
Sk:= TClientSocket.Create(Self);
Sk.Host := ....;
Sk.Port :=....;
Sk.ClientType := ctBlocking;
try
If not Sk.Active then Sk.Active := true;
While not Sk.Active do Application.ProcessMessages;
Sk.Socket.SendBuf(DNSBuffer,Len);
До этого места все отрабатывает.
А ниже все отказывает.
If Assigned(OnReadBuf)
then OnReadBuf(Self,Socket);
Len:=Sk.Socket.ReceiveLength;
Sk.Socket.ReceiveBuf(Buff,Len);
.......................
finally
Sk.Destroy;
end;
end;
ПОмогите, пожалуйста!
Мазут Береговой (2002-11-01 13:46:00) [1]Спасибо огромное за подсказку - буду разбираться...
Мазут Береговой (2002-11-01 13:32:00) [2]Щас посмотрю, дорогой товарищ...
Digitman (2002-11-01 13:27:00) [3]Ну вот же хэлп ! Я же процитировал тебе уже :
If the socket is a blocking socket, use a TWinSocketStream object to read from the connection
Чего мудрить-то ? Четко же и ясно сказано - в блок.режиме используй для ожидания и приема данных объект класса TWinSocketStream.
Что, так трудно полистать хэлп на все касаемое события OnRead да изучить примеры, имеющиеся там ? Ведь примеры там есть !
И пример применения TWinSocketStream - как раз для твоего случая.
Мазут Береговой (2002-11-01 13:17:00) [4]Я хочу! Да только не могу понять, что ты от меня хочешь? Я дал всю информацию, которой располагал. Дальше мои знания кончаются. На все твои вопросы я ответил. Если неправильно - то скажи где неправильно. Ты хотя бы строчку кода для наглядности...
Digitman (2002-11-01 13:07:00) [5]что ж ... печально
разбираться ты не хочешь, я вижу
Мазут Береговой (2002-11-01 13:07:00) [6]1. В private есть еще такая строчка
OnReadBuf : TSocketNotifyEvent;
2. OnDataReceived - событие типа TSocketNotifyEvent, которое я описал в компоненте.Ноя его не использую в компоненте. TSocketNotifyEvent - от TClientSocket.OnRead.
3. Если ставить сокет не синхронный то дает ошибку синхронности
Мазут Береговой (2002-11-01 12:55:00) [7]Так, еще раз публикую свой коде
type TSocketNotifyEvent = procedure (Sender: TObject; Socket: TCustomWinSocket) of object;
type
TDNS = class(TComponent)
...........................
procedure TDNS.SendQuery;
var Buff : TABuffer;
Len : integer;
Socket : TCustomWinSocket;
begin
...................................
Sk:= TClientSocket.Create(Self);
Sk.Host := ....;
Sk.Port :=....;
Sk.ClientType := ctBlocking;
try
If not Sk.Active then Sk.Active := true;
While not Sk.Active do Application.ProcessMessages;
Sk.Socket.SendBuf(DNSBuffer,Len);
До этого места все отрабатывает.
А ниже все отказывает.
If Assigned(OnReadBuf)
then OnReadBuf(Self,Socket);
Len:=Sk.Socket.ReceiveLength;
Sk.Socket.ReceiveBuf(Buff,Len);
.......................
finally
Sk.Destroy;
end;
end;
Мне надо Чтобы все это выполнялось в одной процедуре,а в разных события оно и так работает! Я уже несколько недель ищу хотя бы что-то похожее. Есть только у Piette в ICS, но там так запутано. Лучшая теория - практика. Видно придется у Piette все разбирать раз никто толком помочь не может!
Digitman (2002-11-01 12:47:00) [8]1.что такое OnReadBuf() ? Где и как это у тебя определено и реализовано ?
2. Что это за событие OnDataReceived() ? Где, у какого используемого тобой класса оно определено ? TCustomWinSocket не имеет события с таким именем
3. Где обработка события TCustomWinSocket.OnRead() ? Почему попытка приема ожидаемого ответа происходит у тебя синхронно ?
В это ты вникал ?
Хэлп :
property OnRead: TSocketNotifyEvent;
Description
Write an OnRead event handler to read from the socket connection. If the socket is a blocking socket, use a TWinSocketStream object to read from the connection. Otherwise, use the methods of the Socket parameter to perform the actual reading.
Мазут Береговой (2002-11-01 12:20:00) [9]Ну вот код-то...
Sk:= TClientSocket.Create(Self);
Sk.Host := ....;
Sk.Port :=....;
Sk.ClientType := ctBlocking;
try
If not Sk.Active then Sk.Active := true;
While not Sk.Active do Application.ProcessMessages;
Sk.Socket.SendBuf(DNSBuffer,Len);
До этого места все отрабатывает.
А ниже все отказывает.
If Assigned(OnReadBuf)
then OnReadBuf(Self,Socket);
Len:=Sk.Socket.ReceiveLength;
Sk.Socket.ReceiveBuf(Buff,Len);
.......................
finally
Sk.Destroy;
end;
end;
Digitman (2002-11-01 12:03:00) [10]Ну ты код-то приведешь или нет ??
Мазут Береговой (2002-11-01 11:40:00) [11]SendBuf пишет данные в какой-то внутренний буфер и ставит их на очередь. По-логике, после SendBuf() удаленный сокет должен должен отправить ответ на запрос при этом должно сработать событие OnDataReceived. Но если Вы имеете ввиду, что я должен каким-то образом обработать событие OnSocketEvent (или OnWrite, или OnClientWrite), то я понятия не имею что тут к чему.
Digitman (2002-11-01 11:21:00) [12]Повторяю вопрос : Что происходит в коде передатчика после SendBuf() ? Что делаешь дальше ? Код где ?
Мазут Береговой (2002-11-01 11:15:00) [13]Поняти не имею что там происходит. В своем коде я пытаюсь поймать событие OnReadBuf. До этого я пытался поставить его в цикл, но что-то не получалось - все зависало...
Digitman (2002-11-01 11:09:00) [14]Замечательно.
Что происходит в коде передатчика после SendBuf() ?
Мазут Береговой (2002-11-01 11:02:00) [15]Я уже третий день пытаюсь добиться ответа на этот вопрос. И толькр сейчас добрый человек решил помочь. Я даже на импортных сайтах этот вопрос повесил...
Мазут Береговой (2002-11-01 11:01:00) [16]For blocking sockets, SendBuf returns the number of bytes actually written. Что она и делает (возвращает размер переданного буфера) и не возвращает никаких ESocketError exception. (?)
panov (2002-11-01 10:50:00) [17]В следующий раз, если будешь несколько веток делать с одним вопросом, все они будут удалены.
Мазут Береговой (2002-11-01 10:28:00) [18]Щас посмотрю, погоди-ка...
Digitman (2002-11-01 10:23:00) [19]Читай хэлп на SendBuf() и приведи сначала код передающей стороны в соответствие с описанием.
SendBuf() - это не процедура, а ф-ция, она возвращает строео определенный результат, по которому можно судить об оспешной или неуспешной работе ф-ции
Digitman (2002-11-01 10:21:00) [20]Какое отношение к моему вопросу имеет все это ?
Я пока не веде речь о приемнике. Меня интересует результат работы передатчика, до приемника дело не дошло. Не лезь в дебри -прежде чем рассуждать пространно о работе принимающей стороны, нужна 100%-я гарантия корректности работы передающей стороны.
Я спросил тебя : что возвращает ф-ция SendBuf() и при каких конкретно параметрах ?