Форум: "Сети";
Текущий архив: 2003.08.21;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.007 c