Потоки потоки... Как убить?

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Klinifini
Новичок
Новичок
 
Сообщения: 29
Зарегистрирован: 23.08.2006 (Ср) 17:37

Потоки потоки... Как убить?

Сообщение Klinifini » 31.08.2006 (Чт) 11:42

Столкнулся с проблемой: не могу завершить работу потока.
В потоке идет:
Код: Выделить всё
listener.Start()
server_tcpClient = listener.AcceptTcpClient()

и кагда выполнение находится на строчке listener.AcceptTcpClient() (насколько я понимаю, ожидается подключение клиента?), поток не могу никак завершить: на аборт не реагирует (мне кажется что даже исключение ThreadAbortException не создается?). Помогите пожалуйста разобраться ...

Код: Выделить всё
Private Sub wait()
        Try
            listener.Start()
            Do
                server_tcpClient = listener.AcceptTcpClient()
                server_networkStream = server_tcpClient.GetStream

                Dim bytes(1023) As Byte
                Dim i As Integer = 0

                query = ""
                Do
                    lenght = server_networkStream.Read(bytes, 0, bytes.Length)
                    query = [String].Concat(query, System.Text.Encoding.GetEncoding(1251).GetString(bytes, 0, lenght))
                Loop While server_networkStream.DataAvailable


                server_networkStream.Close()
                server_tcpClient.Close()

            Loop

        Catch e As ThreadAbortException
            listener.Stop()
        End Try
    End Sub

Klinifini
Новичок
Новичок
 
Сообщения: 29
Зарегистрирован: 23.08.2006 (Ср) 17:37

Сообщение Klinifini » 31.08.2006 (Чт) 11:49

Так, кажется, начинаю понимать...
Если заменить server_tcpClient = listener.AcceptTcpClient() на
Код: Выделить всё
Do
                    If listener.Pending Then
                        server_tcpClient = listener.AcceptTcpClient()
                        Exit Do
                    End If
                Loop

То вроде работает.... А нужно ли еще усыплять поток на некторой время в этом чикле?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 31.08.2006 (Чт) 12:04

AcceptTcpClient является блокирующим методом, т.е. останавливает поток. Второй вариант останавливать поток не будет.
А зачем тебе поток то притормаживать понадобилось?
Весь мир матрица, а мы в нем потоки байтов!

Klinifini
Новичок
Новичок
 
Сообщения: 29
Зарегистрирован: 23.08.2006 (Ср) 17:37

Сообщение Klinifini » 31.08.2006 (Чт) 12:16

Ну чтобы по выходу из программы прекращались какие-либо действия )

Есть еще вопрос: Как прочитать сообщение полностью? Почему-то не хочет принимать полностью, а только какую-то часть..
Вообще хочу сделать простенький HTTP прокси. Затея такая:
Ждем клиента, получаем запрос, подключаемся к серверу, отправляем запрос, принимает от сервера данные и передаем клиенту. Но изображения почему-то принимаются не полностью (да и вообще из всех больших сообщений доходит толкьо какая-то часть) =(

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 31.08.2006 (Чт) 13:07

Klinifini

Используй таймаут, если хочешь прерывать работу.

длину запросов обрабатываешь?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Klinifini
Новичок
Новичок
 
Сообщения: 29
Зарегистрирован: 23.08.2006 (Ср) 17:37

Сообщение Klinifini » 31.08.2006 (Чт) 13:13

Т.е. ты предлагаешь мне взять Content-Length и читать пока не наберется необходимое число байтов?

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 31.08.2006 (Чт) 15:32

дык, а как по другому?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 31.08.2006 (Чт) 21:03

Дык не всегда это поле в заголовке присутствует.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 31.08.2006 (Чт) 21:07

Если поля нет, значит пакет не POST - а такие пакеты обычно не большие и приходят сразу.

Совет автору топика: не мучайся с HTTP - намного проще написать SOCKS4 прокси: он принимает IP и порт, коннектится к нему и возвращает результат. Если всё прошло успешно, он дальше втупую пересылает полученные данные и парсинг пакетов ему для работы не требуется. + через него можно работать не только по HTTP
Изображение

Klinifini
Новичок
Новичок
 
Сообщения: 29
Зарегистрирован: 23.08.2006 (Ср) 17:37

Сообщение Klinifini » 01.09.2006 (Пт) 19:26

keks-n
А как SOCKS4 прокси понимает с чем ему соединяться? В HTTP хоть представляю, а в соксе савсем нет.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 02.09.2006 (Сб) 19:40

Ему это в явном виде передают.
Мой пример SOCKS-прокси на VB6 на этом форуме уже выложен.
Изображение


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 25

    TopList