Форум: "Сети";
Текущий архив: 2002.12.30;
Скачать: [xml.tar.bz2];
Вниз
Помогите Мазуту! Найти похожие ветки
← →
Мазут Береговой (2002-11-01 07:16) [0]Здрасте.
Кто знает, почему не принимаются данные и не срабатывает событие?
Ход мыслей такой:
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;
ПОмогите, пожалуйста!
← →
Digitman (2002-11-01 08:50) [1]
> Sk.Socket.SendBuf(DNSBuffer,Len);
>
> До этого места все отрабатывает.
С чего это такая уверенность ?
Где анализ результата SendBuf() ?
← →
Мазут Береговой (2002-11-01 10:04) [2]До этого написал код как прогу. И эти два события обрабатывались на отдельных процедурах TButtonClick и OnDataReceived. А кроме того я иду в отладчике по шагам и дохожу до SendBuffer и внизу на таскбаре вижу что взаимодействуют мой client и DNS сервер. Да и ошибок до этого не вылетает, а вот после того как пытаюсь сделать ReceiveBuffer отладчик дает ошибку Remote host forcibly closed connection. Вот такая уверенность...
← →
Мазут Береговой (2002-11-01 10:17) [3]И еще, если бы соединение не устанавливалось на Sr.Active, то вся эта штука зацикливалась бы на while в ожидании соединения...
Если есть есть еще средства проверить результат SendBuf, то подскажи.
← →
Digitman (2002-11-01 10:21) [4]Какое отношение к моему вопросу имеет все это ?
Я пока не веде речь о приемнике. Меня интересует результат работы передатчика, до приемника дело не дошло. Не лезь в дебри -прежде чем рассуждать пространно о работе принимающей стороны, нужна 100%-я гарантия корректности работы передающей стороны.
Я спросил тебя : что возвращает ф-ция SendBuf() и при каких конкретно параметрах ?
← →
Digitman (2002-11-01 10:23) [5]Читай хэлп на SendBuf() и приведи сначала код передающей стороны в соответствие с описанием.
SendBuf() - это не процедура, а ф-ция, она возвращает строео определенный результат, по которому можно судить об оспешной или неуспешной работе ф-ции
← →
Мазут Береговой (2002-11-01 10:28) [6]Щас посмотрю, погоди-ка...
← →
panov (2002-11-01 10:50) [7]В следующий раз, если будешь несколько веток делать с одним вопросом, все они будут удалены.
← →
Мазут Береговой (2002-11-01 11:01) [8]For blocking sockets, SendBuf returns the number of bytes actually written. Что она и делает (возвращает размер переданного буфера) и не возвращает никаких ESocketError exception. (?)
← →
Мазут Береговой (2002-11-01 11:02) [9]Я уже третий день пытаюсь добиться ответа на этот вопрос. И толькр сейчас добрый человек решил помочь. Я даже на импортных сайтах этот вопрос повесил...
← →
Digitman (2002-11-01 11:09) [10]Замечательно.
Что происходит в коде передатчика после SendBuf() ?
← →
Мазут Береговой (2002-11-01 11:15) [11]Поняти не имею что там происходит. В своем коде я пытаюсь поймать событие OnReadBuf. До этого я пытался поставить его в цикл, но что-то не получалось - все зависало...
← →
Digitman (2002-11-01 11:21) [12]Повторяю вопрос : Что происходит в коде передатчика после SendBuf() ? Что делаешь дальше ? Код где ?
← →
Мазут Береговой (2002-11-01 11:40) [13]SendBuf пишет данные в какой-то внутренний буфер и ставит их на очередь. По-логике, после SendBuf() удаленный сокет должен должен отправить ответ на запрос при этом должно сработать событие OnDataReceived. Но если Вы имеете ввиду, что я должен каким-то образом обработать событие OnSocketEvent (или OnWrite, или OnClientWrite), то я понятия не имею что тут к чему.
← →
Digitman (2002-11-01 12:03) [14]Ну ты код-то приведешь или нет ??
← →
Мазут Береговой (2002-11-01 12:20) [15]Ну вот код-то...
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:47) [16]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:55) [17]Так, еще раз публикую свой коде
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 все разбирать раз никто толком помочь не может!
← →
Мазут Береговой (2002-11-01 13:07) [18]1. В private есть еще такая строчка
OnReadBuf : TSocketNotifyEvent;
2. OnDataReceived - событие типа TSocketNotifyEvent, которое я описал в компоненте.Ноя его не использую в компоненте. TSocketNotifyEvent - от TClientSocket.OnRead.
3. Если ставить сокет не синхронный то дает ошибку синхронности
← →
Digitman (2002-11-01 13:07) [19]что ж ... печально
разбираться ты не хочешь, я вижу
← →
Мазут Береговой (2002-11-01 13:17) [20]Я хочу! Да только не могу понять, что ты от меня хочешь? Я дал всю информацию, которой располагал. Дальше мои знания кончаются. На все твои вопросы я ответил. Если неправильно - то скажи где неправильно. Ты хотя бы строчку кода для наглядности...
← →
Digitman (2002-11-01 13:27) [21]Ну вот же хэлп ! Я же процитировал тебе уже :
If the socket is a blocking socket, use a TWinSocketStream object to read from the connection
Чего мудрить-то ? Четко же и ясно сказано - в блок.режиме используй для ожидания и приема данных объект класса TWinSocketStream.
Что, так трудно полистать хэлп на все касаемое события OnRead да изучить примеры, имеющиеся там ? Ведь примеры там есть !
И пример применения TWinSocketStream - как раз для твоего случая.
← →
Мазут Береговой (2002-11-01 13:32) [22]Щас посмотрю, дорогой товарищ...
← →
Мазут Береговой (2002-11-01 13:46) [23]Спасибо огромное за подсказку - буду разбираться...
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2002.12.30;
Скачать: [xml.tar.bz2];
Память: 0.83 MB
Время: 1.972 c