Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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.5 MB
Время: 0.013 c
14-99340
Ricks
2002-12-04 20:18
2002.12.30
Очень интересно ваше мнение


4-99405
mikhasenko
2002-11-14 17:25
2002.12.30
Специалисты, подскажите!


1-99065
Z-man7777
2002-12-19 13:57
2002.12.30
Как быть с этим?!


7-99367
sef
2002-10-24 21:53
2002.12.30
Выполнение части кода из моего сервиса с правами текущего юзера#3


6-99216
kerrik
2002-11-02 00:31
2002.12.30
Как сделать пинг компьютера?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский