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

Вниз

TSocketServer! Возможно ли сделать именно так?   Найти похожие ветки 

 
FireMan_Alexey ©   (2003-06-05 15:38) [0]

Вопрос наверное глупый, но все-таки задам! Я хотел с помощью TSocketServer
сделать прокси. Пытался отловить, что запрашивает Explorer когда пытается добраться через мой прокси
до нужного адреса. Попытался отловить, что он пересылает
в событии OnRead и OnWrite
Socket.ReciveBuffer(Buffer,Socket.ReciveLength);
но при этом Винды начинают глючить.
Может кто-нибудь подскажет в чем моя ошибка.
Так же пытался выставить службу HTTP, но после этого Explorer вообще перестал конектиться.


 
Polevi ©   (2003-06-05 16:04) [1]

в 17 строке ошибка как обычно


 
Digitman ©   (2003-06-05 16:11) [2]

событие OnWrite совершенно для другой цели предназначено


 
Ghost_ ©   (2003-06-05 16:30) [3]

Посмотри у меня исходник..там все понятно и просто


 
Hogo ©   (2003-06-06 06:26) [4]


> Ghost_ © (05.06.03 16:30)
> Посмотри у меня исходник..там все понятно и просто

Где?


 
Ghost ©   (2003-06-06 07:42) [5]

> Ghost_ Привет тёзка ! :) исходник то покажи !


 
FireMan_Alexey ©   (2003-06-06 15:52) [6]

>Ghost_
А где исходник взять?

>Digitman
Как я понял, событие OnWrite происходит когда клент пытается передать что-нибудь серверу, а OnRead когда взять. Поправте если ошибаюсь.
Explorer когда пытается загрузить какую-нибудь страничку, должне что-то передать как я понимаю?!
Если есть какие-то примеры, то покажите ПОЖАЛУЙСТА!


 
Digitman ©   (2003-06-06 16:06) [7]


> FireMan_Alexey


из хэлпа :

OnWrite:

Occurs when a client socket should write information to the socket connection.

OnClientWrite:

Occurs when the server socket should write information to a client socket.

Кажется, достаточно ясно изложено)

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

По ср. с твоим представлением это выглядит с точностьтью до наоборот : сначала необходимо дождаться события On[Client]Write, а уж затем только пытаться вызывать какие-то send-методы с целью передать какую-то инф-цию на другую сторону соединения


 
AL_!   (2003-06-11 02:58) [8]

Нужны 2 компонента:
TServerSocket - открываем порт 8080, по событию OnClientRead получаем запрос от Браузера. Будет типа этого:
GET /index.html HTTP/1.1
Host: www.delphimaster.ru
и т.д.


TClientSocket - коннектимся на порт 80, адрес извлекаем из запроса (поле Host); посылаем тот же запрос уже на реальный сервер; по событию OnRead получаем ответ от сервера и передаем его Браузеру через ServerSocket примерно так:
procedure TForm1.ClientSocket1Read(... Socket:TCustomWinSocket);
begin
ServerSocket1.Socket.SendText(Socket.ReceiveText);
end;


По событию ClientSocket1.OnDisconnet разрываем связь с Браузером ServerSocket1.Close.

А теперь все это нужно сделать в многопоточном варианте :)
Событие OnWrite вообще не нужно !

В Браузере естесственно настройки прокси: 127.0.0.1:8080


 
Digitman ©   (2003-06-11 08:08) [9]


> AL_!



> Событие OnWrite вообще не нужно !


предположим, гнездо иницировано для работы в асинхронном неблок.режиме.

твои аргументы в пользу такого безосновательного утверждения ?


 
AL_!   (2003-06-12 02:28) [10]

> To Digitman
А что ты собираешься делать в обработчике события OnWrite ?
Если хочешь послать данные, то необязательно дожидаться этого события (см. любой пример в хелпе, например :).
Тем более сколько я не экспериментировал, получалось так, что событие OnWrite происходит только один раз, сразу после коннекта. (правда на обоих концах были делфивские сокеты).
И насчет OnWrite, OnRead. Вот что пишет об этом Marco Cantu:

События OnRead и OnWrite (OnClientRead и OnClientWrite) информируют сокет о том, что другая часть соединения пытается прочитать или записать некоторые данные.


А перевести хелп можно точнее:
Occurs when a client socket should write information to the socket connection.
should переводится следует, а не может (may).


 
FireMan_Alexey ©   (2003-06-18 12:02) [11]

>AL_!
Если можешь, обясни как это в много поточном!
А то я определил, переменную и при кажком коннекте я снова выделяю память для переменной, получается не очень хорошо!
Просто я не знаю как пользоваться потоками!
Если кто знает подскажите!
Заранее благодарен


 
Digitman ©   (2003-06-18 12:33) [12]


> AL_!



> Если хочешь послать данные, то необязательно дожидаться
> этого события.


Да ну ??? А что ты будешь делать , если, к примеру, SendBuf()вернул тебе -1 ? Ты хотел этим методом послать данные, а он тебе в ответ вместо размера посланных данных дает "минус единица" ? Ну ? Твои дальнейшие действия ?


(см. любой пример в хелпе, например :)


вот потому что пример в хэлпе не отражает некоторых важных особенностей работы winsock , здесь в форуме и возникает один и тот же вопрос "я послал данные, а на другом конце - тишина"


> сколько я не экспериментировал, получалось так, что событие
> OnWrite происходит только один раз, сразу после коннекта


да, оно должно возникать не менее одного раза, сразу за событием OnConnect().
поэкспериментируй на примере отправки значительных объемов данных в хост другой подсети - получишь более одного OnWrite()


> насчет OnWrite, OnRead. Вот что пишет об этом Marco Cantu


полную чушь он пишет.
логика генерации события On[Client]Write() не имеет никакого отношения к тому, что творится на др.стороне виртуальной петли соединения.


> А перевести хелп можно точнее:
> Occurs when a client socket should write information to
> the socket connection.
> should переводится следует, а не может (may).


вот именно ! "следует" ! т.е. клиента информируют о факте получения очередной возможности попытаться записать в буфер передачи гнезда очер.порцию данных.

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

"should" же здесь употреблен из соображений, что предыдыщий вызов send-метода дал отказ из-за занятости буфера передачи, но так как передача в конечном итоге все же должна быть выполнена (а не отменена из-за занятости буфера), клиенту по факту OnWrite() "следует" повторить вызов Send-метода с позиции в данных, на которой предыдущий вызов Send-метод дал отказ WSAEWOULDBLOCK.

Вот чтобы была полная ясность в этом вопросе, нельзя ограничиваться одним подстрочным хэлпом, а следует почитать все касаемое ф-ций winsock.send()/recv() в "Winsock Programmer"s Reference" и в MSDN.


> правда на обоих концах были делфивские сокеты


да хоть "делфевые" хоть еще какие-то там !)
winsock остается winsock"ом, а гнезда Беркли - гнездами Беркли.
все остальное - лишь удобные оболочки, не меняющие сути.



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

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

Наверх




Память: 0.51 MB
Время: 0.013 c
14-68480
ZeroDivide
2003-08-06 09:00
2003.08.21
С начала я бросил курить...


3-68225
Алексей
2003-07-25 15:38
2003.08.21
Как получить список уникальных значений поля БД ?


14-68465
Gorlum
2003-08-05 16:41
2003.08.21
fibplus4702


3-68169
Леон
2003-07-29 06:48
2003.08.21
Сложный изменяющийся динамический запрос SQL.


1-68385
gonta
2003-08-07 18:46
2003.08.21
Как отловить нажатие клавиши BackSpace ?