Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите Мазуту!


Страницы:   1 2

Мазут Береговой ©   (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() и при каких конкретно параметрах ?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо