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

Вниз

Помогите Мазуту!   Найти похожие ветки 

 
Мазут Береговой   (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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.02 c
1-99135
VIB
2002-12-18 13:41
2002.12.30
Cursor


1-99083
Emigrant
2002-12-17 02:25
2002.12.30
D6: TListBox


14-99328
Anatoly Podgoretsky
2002-12-10 07:36
2002.12.30
Именинники 10 декабря


3-98990
Дмитрий Орехов
2002-12-10 14:20
2002.12.30
Update Failed


1-99074
кват
2002-12-19 15:47
2002.12.30
TMybutton от Twincontrol - непонятки