- Код: Выделить всё
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 =\
Как вариант - ждать и вылетать по таймауту... но тогда если я через сокс заведу, оно не оборвёт сессию?