Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
7-68561
_ALEXey_
2003-06-06 09:19
2003.08.21
Информация по раскладкам клавиатуры


1-68257
kull
2003-08-06 10:04
2003.08.21
Работа с интерфейсами...


1-68399
Alexno
2003-08-07 12:42
2003.08.21
Выгрузка в Excel


14-68535
Артем Запаранюк
2003-08-03 12:31
2003.08.21
Давайте обсудим примерную дату начала времени 64-bit приложений


1-68387
tytus
2003-08-08 23:34
2003.08.21
ListView





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский