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

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

Использование сокета(клиента) в консольном приложении [D6, Win2k]


Страницы:   1 2

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.


Страницы:   1 2

Наверх

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