Net.(TcpClient/Sockets)

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

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

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Net.(TcpClient/Sockets)

Сообщение FireFenix » 26.09.2009 (Сб) 1:00

Использую сокеты, т.к. хочу потом прикрутить Соксы5
Код: Выделить всё
       Dim Tcp As New TcpClient
        Tcp.Connect("site.ru", 80)
        Tcp.LingerState = New LingerOption(True, 100)
        Tcp.SendTimeout = 50000
        Tcp.ReceiveTimeout = 50000
        S = Tcp.GetStream
        S.WriteTimeout = 50000
        S.ReadTimeout = 50000

        strGet = _
        "GET http://site.ru/getimg.php?8 HTTP/1.1" & vbCrLf & _
        "Host: site.ru" & vbCrLf & _
        "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3" & vbCrLf & _
        "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" & vbCrLf & _
        "Accept-Language: ru,en-us;q=0.7,en;q=0.3" & vbCrLf & _
        "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7" & vbCrLf & _
        "Keep-Alive: 300" & vbCrLf & _
        "Connection: keep-alive" & vbCrLf & vbCrLf

        bData = System.Text.Encoding.ASCII.GetBytes(strGet)

        S.Write(bData, 0, bData.Length)

        ReDim bData(1024)

        Dim rr As Integer

        Do
            rr = S.ReadByte

            If rr = -1 Then
                Exit Do
            Else
                If All Is Nothing Then
                    ReDim All(0)
                    All(0) = rr
                Else
                    ReDim Preserve All(UBound(All) + 1)
                    All(UBound(All)) = rr
                End If
            End If
        Loop While True

        Console.WriteLine(Encoding.Default.GetString(All))

        S.Close()

        For i = 0 To All.Length - 4
            If All(i) = 13 And All(i + 1) = 10 And All(i + 2) = 13 And All(i + 3) = 10 Then
                ReDim bImage(UBound(All) - i - 4)

                Array.Copy(All, i + 4, bImage, 0, UBound(All) - i - 3)
                Exit For
            End If
        Next

        'Dim Str As String = Encoding.Default.GetString(All)
        'Str = Regex.Replace(Str, "[\s\S]+?\r\n\r\n", "")

        MemoryStream = New System.IO.MemoryStream(bImage)

        PictureBox1.Image = Image.FromStream(MemoryStream)

У NetworkStream есть свойство S.DataAvailable, но как ни странно он врёт!

Так вот,в ходе всех махинаций, когда пердача данных окончена S.ReadByte не всегда возвращает -1, т.е. программа ждёт до конца таймаута и выбрасывает "Unable to read data from the transport connection: Попытка установить соединение была безуспешной..."
Получается единственный верный способ - это каждый раз считывать заголовок и из него парсить Content-Length и выходить из цикла когда достигнуто это количество? Или есть гуманные способы?

Ну для контента ещё понятно.... а как быть с получением тела сайта? ведь там нету Content-Length =\
Как вариант - ждать и вылетать по таймауту... но тогда если я через сокс заведу, оно не оборвёт сессию?
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Net.(TcpClient/Sockets)

Сообщение Williams » 26.09.2009 (Сб) 12:18

Poll?
И вы думаете, что вас оставят в живых после прочтения этого поста?

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Net.(TcpClient/Sockets)

Сообщение FireFenix » 26.09.2009 (Сб) 21:57

Williams писал(а):Poll?

Студия и сокеты меня всегда радовали (в том числе вебклиент, хттпвебреквест и т.д.)....5 недель аптайма компа... вроде всё работало, но сокеты не реагировали как надо.... сделал ребут и теперь всё как положено выходит из цикла (т.е. выводит что получено 0 байт у S.Receive(Buffer)), даже под проксёй... мистика!!!
Код: Выделить всё
        While True
            resReceive = S.Receive(Buffer)

            If resReceive > 0 Then
                Result &= System.Text.Encoding.Default.GetString(Buffer)
                'Debug.WriteLine(System.Text.Encoding.Default.GetString(Buffer))
            Else
                Exit While
            End If

            Threading.Thread.Sleep(1)
        End While


А с методом Poll чё-то у меня не сложилось.... оно всегда выводит True. Если тыкать другие параметры - то нет чёткого момента, что передача оконченна
Код: Выделить всё
S.Poll(-1, SelectMode.SelectRead)
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Net.(TcpClient/Sockets)

Сообщение Williams » 27.09.2009 (Вс) 12:48

Poll не так юзается.

Код: Выделить всё
If item.Client.Poll(10, SelectMode.SelectRead) _
                               AndAlso (item.Client.Available = 0) OrElse Not item.Connected Then


Означает, что коннекта нет.
И вы думаете, что вас оставят в живых после прочтения этого поста?

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Net.(TcpClient/Sockets)

Сообщение FireFenix » 27.09.2009 (Вс) 14:34

Williams писал(а):Poll не так юзается.

Код: Выделить всё
If item.Client.Poll(10, SelectMode.SelectRead) _
                               AndAlso (item.Client.Available = 0) OrElse Not item.Connected Then


Означает, что коннекта нет.

Хм... я юзал как было в примерах мсдн....
сейчас попробуем ваш вариантег =)

Спасибо. Работает.
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Net.(TcpClient/Sockets)

Сообщение FireFenix » 27.09.2009 (Вс) 18:28

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

При считывании данных (если не делать проверку "S.Poll(10, SelectMode.SelectRead) AndAlso (S.Available = 0) OrElse Not S.Connected") TcpClient вылетает
Код: Выделить всё
Unable to read data from the transport connection: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера.

А если делать с сокетами, то вылетает
Код: Выделить всё
Object reference not set to an instance of an object... бла-бла

причём во втором запросе всегда "S.Available = 0" почему-то...

Но! Если получать 1раз фиксированное количество байт, вроде
Код: Выделить всё
bData = System.Text.Encoding.ASCII.GetBytes(strGet)

S.Write(bData, 0, bData.Length)
S.Read(bData, 0, 512)

S.Close()

то всё прекрасно работает...

возможно ли без переподключения принять результат второго запроса?
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23

    TopList