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

Вниз

Использование TTcpClient   Найти похожие ветки 

 
Эл ©   (2004-01-18 23:05) [0]

Здравствуйте!
Не совсем понятно как с TTcpClient работать: событие onReceive не генерируется автоматически, как в TClientSocket, приходится "вытягивать" информацию ReceiveBuf"ом, при этом программа или не реагирует, или зацикливается - стало быть нужен отдельный Thread?


 
Piter ©   (2004-01-19 01:05) [1]

Эх, ну если событие OnReceive там есть - значит не просто так?

Есть такое свойство у этого компонента BlockMode - вот и поставь там bmNonBlocking.

А если работать с блокирующими сокетами - то да, в отдельный поток.


 
Эл ©   (2004-01-19 08:01) [2]

поставил bmNonBlocking. onRecieve по-прежнему не работает.

приведу код:

var sock: TTcpClient;
procedure TForm1.FormClick(Sender: TObject);
begin
 sock:=TTcpClient.Create(self);
 sock.RemoteHost:="localhost";
 sock.RemotePort:="6667";
 sock.OnReceive:=Receive;
 sock.BlockMode:=bmNonBlocking;
 sock.Open;
end;

procedure TForm1.receive;
begin
 showmessage("data recvd!");
end;


при этом firewall показывает, что соединение установлено и ему отправлено 201 байт.


 
Piter ©   (2004-01-19 16:00) [3]

Фиг знает что происходит. У меня тоже событие не возникает. Да и OnConnect не работает... какой-то левый компонент.

Могу только посоветовать использовать другие компоненты


 
Verg ©   (2004-01-19 16:31) [4]


> - стало быть нужен отдельный Thread?


Выходит, что нужен.

Эти компоненты не используют наворотов WINSock. Сделано это для обеспечения кросс-платформы.
Так что, никаких WSAAsync(Event)Select.... Чистые UNIX-стиль сокеты...


 
Piter ©   (2004-01-19 16:43) [5]

Нафига там события, если они никогда не возникают? Вот в чем вопрос. Странно это. Может, Digitman пояснит...


 
Verg ©   (2004-01-19 16:53) [6]


> Piter ©   (19.01.04 16:43) [5]
> Нафига там события, если они никогда не возникают?


Они возникают. Но только "с твоей подачи".
К приемру,
когда ты вызываешь метод Receiveln(символ(ы) конца строки происходит прием порций пока не встертятся эти самые символы КС и по мере приема порций будет вызываться OnReceive, ну например, чтобы ты мог "фильтровать" входной поток.


 
Piter ©   (2004-01-19 18:59) [7]

Вот это логика... а как узнать, когда вызывать эти Receiveln?

И еще что интересно - событие OnConnect тоже с моей подачи возникает? :)))


 
Verg ©   (2004-01-19 19:08) [8]


> Piter ©   (19.01.04 18:59) [7]
> Вот это логика... а как узнать, когда вызывать эти Receiveln?
>
> И еще что интересно - событие OnConnect тоже с моей подачи
> возникает? :)))


1. Зря смеешься. Это так и есть на самом деле.
2. Когда и чего вызывать определяется функцией select


 
Verg ©   (2004-01-19 19:14) [9]

Да, и еще посмотри в хелпах про сокеты темы:
1. Что такое FD_SET и связанные с ней макросы.
2. Блокирующий и неблокирующий режимы сокетов
3. Фукции recv/send/recvfrom/sendto
4. Фукцию select и для чего она нужна

загляни в исходник, в конце концов (Socket.pas) и сравни его с исходником ScktComp.pas. Особенно обрати внимание на слово Linux.

Может жизнь не такой веселой покажется, но более сознательной - это точно....


 
Piter ©   (2004-01-19 22:06) [10]

Verg, ладно, если ты уж разобрался с этими сокетами, скажи - когда там возникает событие OnConenct? Или мне самому его надо вызывать?


 
Эл ©   (2004-01-20 07:34) [11]


> Вот это логика... а как узнать, когда вызывать эти Receiveln?

Сдается мне его нужно вызывать сразу после открытия сокета в цикле до закрытия. А чтобы программа не замерла на этом, делать в отдельном треде. Только вот я думал что в TTcpClient это все же очеловечено как-то.. в таком случае легче просто написать свой сокет на апи. Или юзать TClientSocket (хотя и у него с ReceiveBuf какие то накладки - не получилось считать буфер в PChar (память под строку выделил, не забыл ;)) )


 
Verg ©   (2004-01-20 10:23) [12]


> Piter ©   (19.01.04 22:06) [10]
> Verg, ладно, если ты уж разобрался с этими сокетами, скажи
> - когда там возникает событие OnConenct? Или мне самому
> его надо вызывать?


В блокирующем режиме OnConnect вызовется после установления соединения. Т.е. active:=true (или просто open) заблокируется до окончания оперции соединения. После успешного установления соединения вызывается OnConnect и ф-ция Open на этом заканчивается.

В неблокирующем режиме OnConnect может вообще не возникнуть т.к. метод open скорее всего вернет управление сразу же с ошибкой WSAEWOULDBLOCK, что означает, что операция соединения успешно началась.
Чтобы определить когда соединение установилось (или попытка закончилась неудачно) вызывается метод select и когда он вернется с установленным флагом WriteReady (ах уж этот OnWrite!! :)) сокет подключился успешно и можно начинать передавать/принимат данные. Select может вернут и флаг ExceptFlag, что будет означать нудавшееся подключение. Кроме того, у select есть TimeOut....


> Сдается мне его нужно вызывать сразу после открытия сокета
> в цикле до закрытия. А чтобы программа не замерла на этом,
> делать в отдельном треде. Только вот я думал что в TTcpClient
> это все же очеловечено как-то.. в таком случае легче просто
> написать свой сокет на апи. Или юзать TClientSocket (хотя
> и у него с ReceiveBuf какие то накладки - не получилось
> считать буфер в PChar (память под строку выделил, не забыл
> ;)) )


А мне сдается, что если вы собираетесь создавать чисто виндозную прогу, то какого .... вы стали использовать кросс-платформенную компоненту? Зачем?
Именно TClientSocket - это то, что для вас доктор прописал :)



Страницы: 1 вся ветка

Текущий архив: 2004.03.28;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.026 c
4-1073987601
_lordtime_
2004-01-13 12:53
2004.03.28
Есть ли возможность узнать время старта Windows?


1-1079029367
Pahan_
2004-03-11 21:22
2004.03.28
Убрать подсвойство в TFont


1-1078642888
elloner
2004-03-07 10:01
2004.03.28
Создать свое событие


9-1060377275
Norlin
2003-08-09 01:14
2004.03.28
вопрос по построению игр: здесь есть игровые художники?


1-1078965622
Chlavik
2004-03-11 03:40
2004.03.28
При Application.Minimize оставляем одно окно в OnTop