![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Использование сокета(клиента) в консольном приложении [D6, Win2k]
Vint45 © (2003-09-24 11:13:00)
Здраствуйте! У меня есть консольный CGI-модуль. После того как он принимает данные от веб-сервера, их необходимо передать дальше на другой сервер по сокетному соединению.
Подскажите можно ли в этом консольном приложении использовать TClientSocket? Если да, то как назначить обработку событий?
Alex Konshin (2003-09-24 22:11:00) [1]
Самая полная документация по Winsock2 в MSDN: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/windows_sockets_start_page_2.asp
На худой конец сойдет sock2.hlp, который идет в поставке Delphi версии >=5. Ладно, я так понял ты пока еще топриком плаваешь, поэтому пока попользуй свой любимый TClientSocket, потом когда окрепнешь - нальем воду и научим плавать по-настоящему.
Успехов.
Vint45 (2003-09-24 16:57:00) [2]
Ага, вроде получилось и принять данные и получить их.
Verg (2003-09-24 16:52:00) [3]
> Или я чего-то не так понял?
Все правильно понял. Только T(Client/Server)Socket могут в принципе обойтись и без этого. См. Digitman.
Basilio (2003-09-24 16:41:00) [4]
А ещё кто-то говорил, что если нет цикла обработки сообщений (Application.Run, Application.ProcessMessages, на худой конец просто апишный цикл GetMessage-TranslateMessage-DispatchMessage), то большинство VCL компонентов работать не будут...
Поэтому в консольном приложении надо его (цикл) создавать.
Или я чего-то не так понял?
Digitman (2003-09-24 15:37:00) [5]
> Переход в него не переходит, если в программе не делать
> задержку.
установи перед ClientSocket.Open св-во ClientSocket.ClientType := ctBlocking
и будет тебе счастье
и не спрашивай - почему ...
ответ - во внимательном изучении спецификации Winsock и предельно четком понимании механизма асинхронных событий Windows
Vint45 (2003-09-24 15:25:00) [6]
События вроде перекрыл, но работает не так как надо.
Специально для Alex Konshin говорю, что я не цепляюсь за TClientSocket, меня заинтересовал вопрос как через консольное приложение, в котором не создан объект Application можно обрабатывать события. Кстати, по WinSock2 можете дать какие-нибудь ссылки? Буду премного благодарен.
Теперь о событиях в консоле.
Я перекрыл событие OnConnect. Переход в него не переходит, если в программе не делать задержку. Например с помощью ShowMessage, в этом случае событие обрабатывается. Вроде это и понятно, так как консольная программа, после того как выполнит все команды, заканчивает свое действие и событие не успевает наступить. В таком случае мне для обработки событий нужно создавать свой какой-то цикл, в котором дожидаться наступления события или есть что-то еще? Мне просто интересно, потому как буду пользоваться все-таки WinSock2.
Digitman (2003-09-24 14:17:00) [7]
> Конечно, можно не создавать и сделать через приведения к
> TMethod
я это и имел ввиду
разумеется, на данном этапе познания "таинств" для автора это сущий геморрой)
Alex Konshin (2003-09-24 13:57:00) [8]
Со статическим не пройдет, потому как у него self это указатель на класс. Компилятор это не должен пропускать.
Конечно, можно не создавать и сделать через приведения к TMethod, но если мы тут это сейчас объяснять будем, то человек в конец запутается.
Digitman (2003-09-24 13:38:00) [9]
> Alex Konshin
> но и создать объект этого класса
ошибаешься в сем категоричном утверждении
в принципе экземпляр класса существовать не обязан, если используемый его метод статический.
главное чтобы метод класса был правильно объявлен и правильно работал с явными и неявными параметрами
Vint45 (2003-09-24 13:30:00) [10]
Спасибо, буду знать
Alex Konshin (2003-09-24 13:27:00) [11]
Даже не просто объявить класс, но и создать объект этого класса.
Alex Konshin (2003-09-24 13:26:00) [12]
А что в этом плохого?
Можно обойтись и без него, но раз у тебя такие вопросы возникают, то лучше делай как говорят, это тебе понятней будет.
Vint45 (2003-09-24 13:23:00) [13]
Хорошо, мне чтобы обработать событие, надо свой класс объявить?
Digitman (2003-09-24 12:59:00) [14]
> Vint45
понятия "процедура" и "процедурный метод класса" весьма различающиеся.
procedure TSomeClass.SConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
end;
Vint45 (2003-09-24 12:45:00) [15]
> Не, ну
> Cs:=TClientSocket.Create(nil);
> cs.onRead:= <Метод класса>
:) именно так я и делал, но на <Метод класса> меня не хватило. Т.е. подставляю имя процедуры, а компилятор выдает ошибку. Объявляю так:
procedure SConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
end;
ClientSocket:=TClientSocket.Create(nil);
ClientSocket.OnConnect:=SConnect; < ошибка
Verg (2003-09-24 12:41:00) [16]
> Я просто не понимаю, почему вы за него цепляетесь?
Наверно привычка.
Человек, который всегда переплывал реку на лодке, будет еще долго спрашивать при переплывании вплавь: В какой руке держать весла?
Alex Konshin (2003-09-24 12:33:00) [17]
Я просто не понимаю, почему вы за него цепляетесь?
Экономии никакой, а вопросы возникают. Если же писать прямо на Winsock2 API, то и вопроса бы не возникло, а по коду практически тоже самое и выйдет. В Winsock2 нет небходимости в очереди сообщений, как в Winsock (и в TClientSocket соответственно).
Но если по вопросу, то да, в консольном приложении можно работать и с TClientSocket.
Verg (2003-09-24 12:02:00) [18]
Не, ну
Cs:=TClientSocket.Create(nil);
cs.onRead :=<Метод класса>
Это что, не канает......?
Как сказал HolACost!, ежупонятно, что ClientSocket создаст окно для своих личных меркантильных целей. ну да и хрен с ним - пусть создает, видно его все равно не будет.
Vint45 (2003-09-24 11:46:00) [19]
Конечно я не танке, но мне бы хотелось бы узнать, можно или нельзя работать с TClientSocket в консольном приложении. Ведь работа этого приложения основана на событиях, а в консольном приложении имхо события не поддерживаеются. Если так, то вопрос снят.
> Alex Konshin © (24.09.03 11:20) [2]
> А зачем тебе тогда нужен этот TClientSocket?
> Работай прямо на Winsock2 API.
Спасибо, буду смотреть.
Alex Konshin (2003-09-24 11:20:00) [20]
А зачем тебе тогда нужен этот TClientSocket?
Работай прямо на Winsock2 API.