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

Вниз

TClientSocket без форм. Возможно ли это?   Найти похожие ветки 

 
Anatoly Podgoretsky ©   (2004-02-12 09:16) [40]

Defunct (12.02.04 04:53) [26]
Inhеrited только косвенно относится к методам, косвенно поскольку его можно применить и к ним. На самом деле эта такая конструкция, которая позволяет опустить указание имени наследника и в случае методов еще и их аргументы если они совпадают. Аналогично использованию Self


 
Digitman ©   (2004-02-12 09:43) [41]


> Alex Konshin © (12.02.04 08:38) [38]



> TCustomWinSocket сам создает окно


> похоже, что проблемы не будет


ну и что ? ну да, создает ! тот кодовый поток, который создал окно, должен организовать и упомянутый цикл, иначе оконная ф-ция не будет вызвана, не смотря на то что окно существует


 
Alex Konshin ©   (2004-02-12 10:05) [42]

Дык она же и организует этот цикл - там ведь у AllocateHwnd параметр есть - метод wndproc, а нем Dispatch вызывается и именно поэтому я думаю, что все должно работать автоматом.
Кстати, никто про кодовый поток отличный от главного (VCL) потока вроде и не заикался, хотя я и не вижу причин, почему бы этому не работать и в другой нити.
Я скажу честно - для меня самого это неожиданность, я все время считал, что в TCustomWinSocket ничего подобного нет.
Похоже, что нужно просто использовать property Handle как параметр для передачи его в асинхронные функции.
И всего-то...


 
Verg ©   (2004-02-12 10:26) [43]


> Alex Konshin © (12.02.04 10:05) [42]
> Дык она же и организует этот цикл - там ведь у AllocateHwnd
> параметр есть - метод wndproc, а нем Dispatch вызывается
> и именно поэтому я думаю, что все должно работать автоматом.


Нет, никто там циклов никаких не организует.
WndProc-то кто по-твоему вызывает?


 
Alex Konshin ©   (2004-02-12 10:56) [44]

Теперь вижу, что не организует...
Ну вообще-то организовать его не проблема.

Не, с Winsock2 все-таки понятнее :)


 
Verg ©   (2004-02-12 10:58) [45]


> Alex Konshin © (12.02.04 10:56) [44]
> Теперь вижу, что не организует...
> Ну вообще-то организовать его не проблема.


Об чем и речь:

> Digitman © (12.02.04 08:31) [37]


 
Digitman ©   (2004-02-12 11:19) [46]


> Alex Konshin © (12.02.04 10:05) [42]


думаю, у тебя каша в голове


> метод wndproc, а нем Dispatch вызывается


Это совсем другой Dispatch(), не имеющий никакого отношения DispatchMessage()


> Кстати, никто про кодовый поток отличный от главного (VCL)
> потока вроде и не заикался


а при чем здесь доп.код.поток ? и при чем здесь VCL ?
объект Application не используется, соотв-но не используется и его метод Run, который в случае с GUI-приложения под управлением VCL как раз и организует цикл

а раз так, то это придется делать "ручками", вне зависимости от код.потока, иначе ни одно окно созданное в некоем конкретном код.потоке (будь то основной или любой дополнительный) не получит сообщения и его оконная ф-ция никогда не будет вызвана


 
Digitman ©   (2004-02-12 11:22) [47]


> Winsock2 все-таки понятнее


не менее понятно и использование той же же Winsock в модуле soktcomp.pas - совершенно прозрачный алгоритм, использующий те же Winsock-вызовы, но "упакованные" в достаточно удобную "VCL-обертку"


 
Alex Konshin ©   (2004-02-12 11:32) [48]

думаю, у тебя каша в голове
Не, нет у меня каши.
Просто мне эти классы использовать никогда не приходилось, сегодня первый раз взглянул и увидел старого знакомого AllocateHwnd. Сразу про все и не сообразил.
Знаю я про Application.Run и про другие thread.

PS: Ты чего так накинулся-то? Не выспался что-ли?


 
Digitman ©   (2004-02-12 12:03) [49]


> Alex Konshin © (12.02.04 11:32) [48]


да ладно тебе ... не заводись .. все в порядке


 
Defunct   (2004-02-12 19:03) [50]

> Verg © (12.02.04 07:59) [34]
Ув. Verg если вы незнакомы с изменениями секции Internet в последних версиях Delphi, то лучше вообще ничего не говорить.

Напрасно Вы так считаете, приведенный пример, компилируется и отлично работает в Delphi 5 (в котором есть модуль ScktComp.pas).

Если Вы используете Delphi 7 в котором Internet секция изменена и работа с сокетами осуществляется посредством модуля Sockets.pas, то там совсем другие классы: TTcpCLient, TTcpServer на базе TCustomIpClient.

Вопросы [1], [5] относились к классу TClientSocket (ScktComp.pas), из чего я сделал вывод, что применяется Delphi 5, и дал соответстующий проверенный пример.

> Digitman © (12.02.04 08:31) [37]
При создании экзкмпляра TCustomWinSocket сокет настроен на ctNonBlocking режим.


 
Defunct   (2004-02-12 19:19) [51]

Вместо того чтобы просто взять откомпилировать, то что приведено в [17], началась куча политических дебатов.

2 Verg:

Насчет конструкции
Socket := TCustomWinSocket(Nil);

Проверь:
Form := TForm.Create(Nil);
(Так я создаю формы динамических отчетов внутри DLL, и ни разу не испутывал проблем)

Обе конструкции работоспособны, и вообще какая разница для Socket кто его владелец. Какие-то дремучие предрассудки.


 
Verg ©   (2004-02-13 12:29) [52]

Defunct (12.02.04 19:03) [50]

Вот кусок этого модуля

TCustomWinSocket = class
private
FSocket: TSocket;
FConnected: Boolean;
FSendStream: TStream;
FDropAfterSend: Boolean;
FHandle: HWnd;
FAddr: TSockAddrIn;
FAsyncStyles: TASyncStyles;
FLookupState: TLookupState;
FLookupHandle: THandle;
FOnSocketEvent: TSocketEventEvent;
FOnErrorEvent: TSocketErrorEvent;
FSocketLock: TCriticalSection;
FGetHostData: Pointer;
FData: Pointer;
// Used during non-blocking host and service lookups
FService: string;
FPort: Word;
FClient: Boolean;
FQueueSize: Integer;
function SendStreamPiece: Boolean;
procedure WndProc(var Message: TMessage);
procedure CMLookupComplete(var Message: TCMLookupComplete); message CM_LOOKUPCOMPLETE;
procedure CMSocketMessage(var Message: TCMSocketMessage); message CM_SOCKETMESSAGE;
procedure CMDeferFree(var Message); message CM_DEFERFREE;
procedure DeferFree;
procedure DoSetAsyncStyles;
function GetHandle: HWnd;
function GetLocalHost: string;
function GetLocalAddress: string;
function GetLocalPort: Integer;
function GetRemoteHost: string;
function GetRemoteAddress: string;
function GetRemotePort: Integer;
function GetRemoteAddr: TSockAddrIn;
protected
procedure AsyncInitSocket(const Name, Address, Service: string; Port: Word;
QueueSize: Integer; Client: Boolean);
procedure DoOpen;
procedure DoListen(QueueSize: Integer);
function InitSocket(const Name, Address, Service: string; Port: Word;
Client: Boolean): TSockAddrIn;
procedure Event(Socket: TCustomWinSocket; SocketEvent: TSocketEvent); dynamic;
procedure Error(Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer); dynamic;
procedure SetAsyncStyles(Value: TASyncStyles);
public
constructor Create(ASocket: TSocket);
destructor Destroy; override;
procedure Close;
procedure DefaultHandler(var Message); override;
procedure Lock;
procedure Unlock;
procedure Listen(const Name, Address, Service: string; Port: Word;
QueueSize: Integer; Block: Boolean = True);
procedure Open(const Name, Address, Service: string; Port: Word; Block: Boolean = True);
procedure Accept(Socket: TSocket); virtual;
procedure Connect(Socket: TSocket); virtual;
procedure Disconnect(Socket: TSocket); virtual;
procedure Read(Socket: TSocket); virtual;
procedure Write(Socket: TSocket); virtual;
function LookupName(const name: string): TInAddr;
function LookupService(const service: string): Integer;

function ReceiveLength: Integer;
function ReceiveBuf(var Buf; Count: Integer): Integer;
function ReceiveText: string;
function SendBuf(var Buf; Count: Integer): Integer;
function SendStream(AStream: TStream): Boolean;
function SendStreamThenDrop(AStream: TStream): Boolean;
function SendText(const S: string): Integer;

property LocalHost: string read GetLocalHost;
property LocalAddress: string read GetLocalAddress;
property LocalPort: Integer read GetLocalPort;

property RemoteHost: string read GetRemoteHost;
property RemoteAddress: string read GetRemoteAddress;
property RemotePort: Integer read GetRemotePort;
property RemoteAddr: TSockAddrIn read GetRemoteAddr;

property Connected: Boolean read FConnected;
property Addr: TSockAddrIn read FAddr;
property ASyncStyles: TAsyncStyles read FAsyncStyles write SetAsyncStyles;
property Handle: HWnd read GetHandle;
property SocketHandle: TSocket read FSocket;
property LookupState: TLookupState read FLookupState;

property OnSocketEvent: TSocketEventEvent read FOnSocketEvent write FOnSocketEvent;
property OnErrorEvent: TSocketErrorEvent read FOnErrorEvent write FOnErrorEvent;

property Data: Pointer read FData write FData;
end;


Вым надо объяснять что такое TScoket и почему он несовместим с nil ?


> Defunct (12.02.04 03:06) [17]
> Человек спросил одно, а все пишут бог знает что... напоминает
> политическую дискуссию ;>
>
>
> var Socket : TCustomWinSocket;
> ...
> ...
> // Создание сокета
> Socket := TCustomWinSocket.Create( Nil );
>
> Socket.Address:=RemoteAddr; { IP адрес куда подрубаемся
> }
> Socket.Port:=RemotePort; { Порт куда подрубаемся }
>
> {Обработчик ошибок - обязательно должен содержать строку
> ErrorCode := 0; иначе будет выскакивать ссобщение об ошибке
> винды}
> Socket.OnError:=SocketError;
>
> Socket.OnConnect:=SocketConnect; { не обязательно }
> Socket.OnDisconnect:=SocketDisconnect; { не обязательно
> }
> Socket.OnRead:=SocketRead; { Прием данных }
> Socket.OnWrite:=SocketWrite; { завершение посылки необязательно
> обслуживать }
> Socket.Active:=True; { Соединение }


Вам надо объснять, что у TCustomWinSocket нет ни OnRead, ни OnWrite ни OnConnect... и ни свойста Active....?


 
Verg ©   (2004-02-13 13:37) [53]

Да, и кстати, что именно "применяется" легче всего узнать по subj ветки.


> TClientSocket без форм. Возможно ли это? [ D6, Win2k]


 
Digitman ©   (2004-02-13 14:13) [54]


> Defunct (12.02.04 19:03) [50]


> При создании экзкмпляра TCustomWinSocket сокет настроен
> на ctNonBlocking режим


правильно, по дифолту.


> Человеку надо работать с сокетом, возможно в консольном
> приложении


именно "возможно", но вовсе не обязательно
а если уж и заикнулся о "возможно", почему вместе со своим (весьма и весьма проюлемным) кодом не упоминаешь о цикле выборки/диспетчеризации ? или неведомо тебе сие в принципе ?


 
Digitman ©   (2004-02-13 14:19) [55]


> Defunct (12.02.04 19:03) [50]
> если вы незнакомы с изменениями секции Internet
> в последних версиях Delphi
.......
> приведенный пример, компилируется
> и отлично работает в Delphi 5 (в котором есть модуль ScktComp.pas).
>


при чем здесь изменение секции палитры ?
мало ли чего Борланду в голову стукнуло в тот момент !
но свою паству он не кинул, если тебе сие не известно, и разместил соотв.пакет в ($DELPHI)\lib, откуда его мгожно в любой момент достать и установить в палитру ... а DCUs соответствующие и без оных действий доступны


 
Defunct   (2004-02-13 17:56) [56]

Verg © (13.02.04 12:29) [52]

Бах.. признаю свою ошибку.
На месте
Socket := TCustomWinSocket(Nil); [17]
должно быть
Socket := TClientSocket(Nil);

Digitman © (13.02.04 14:19) [55]
Это было писать не к чему, я просто изначально подумал что Verg
> пример неработоспособен, мало того, так еще и не компилируем. [34]
имел ввиду "некомпилируемость" из-за отсутствия ScktComp.pas.


 
Verg ©   (2004-02-13 18:17) [57]

Defunct (13.02.04 17:56) [56]

Ну и.....


> Defunct (12.02.04 05:24) [28]
> Напоследок скажу, что TClientSocket на самом деле хуже чем
> TCustomWinSocket, объясню почему.
Дело в том, что TClientSocket,
> мало того что является наследником TCustomSocket, так он
> еще и содержит дополнительно экземпляр TCustomWinSocket.
> Лишняя избыточность. Отличается он визуальной секцией Published,
> для отображения настроек в Object Inspector. Прн динамическом
> создании сокета, эта часть абслолютно не нужна.
> Да и при работе с TClientSocket надо работать так:
> TClientSocket.Socket.ReadString();
> А при работе с TCustomWinSocket так:
> TCustomWinSocket.ReadString();
> Как видно, отпадает лишнее слово "Socket" ;>



> Defunct (12.02.04 19:03) [50]
> > Verg © (12.02.04 07:59) [34]
> Ув. Verg если вы незнакомы с изменениями секции Internet
> в последних версиях Delphi, то лучше вообще ничего не говорить.
>
> Напрасно Вы так считаете, приведенный пример, компилируется
> и отлично работает
в Delphi 5 (в котором есть модуль ScktComp.pas).
>


Продолжать?

Перед тем, как на полном серъезе давать конкретные советы "как лучше жить" да еще и с кодом, надо сто раз подумать, а еще лучше все проверить, а не обвинять в каких-то там предрассудках, политичности дебатов и проч. ДБЗ типа пурга....


 
Defunct   (2004-02-13 18:53) [58]

[51]
Вместо того чтобы просто взять откомпилировать, то что приведено в [17], началась куча политических дебатов.

[57]
Перед тем, как на полном серъезе давать конкретные советы "как лучше жить" да еще и с кодом, надо сто раз подумать, а еще лучше все проверить, а не обвинять в каких-то там предрассудках, политичности дебатов и проч. ДБЗ типа пурга....


шутку понял, смешно.
Мораль всей байки такова: от долгой работы с чем-то создается стереотип, стереотип переходит в веру. ;>
Ну забыл, что создается TClintSocket, а потом TCustomWinSocket, потому что в основном используется TCustomWinSocket.

PS: Могли бы пример подправить, и не было б всей этой каши.
Там всего-то один штрих и все было б как надо.



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

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

Наверх




Память: 0.6 MB
Время: 0.022 c
4-80369
BiN
2003-12-17 11:38
2004.02.25
NetGetJoinInformation - портирование функции


4-80360
Delphi5.01
2003-12-17 19:26
2004.02.25
Hook dla mausa


1-79942
Zemal
2004-02-09 16:35
2004.02.25
Как получить из консольного приложения путь к исполняемому файлу?


4-80370
SkyRanger
2003-12-16 04:05
2004.02.25
Проблема с ХР


14-80197
syte_ser78
2004-01-30 11:49
2004.02.25
Задорнов