Что нового

Некорректные данные при использовании TCP*

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Использую функцию получения содержимого страницы:

Код:
TCPStartup()

ConsoleWrite(_HTTPRead('onlinefilmx.ru', '/'))
;~ ConsoleWrite(BinaryToString(InetRead('http://onlinefilmx.ru')))

TCPShutdown()

Func _HTTPRead($sHost, $sPage, $sStopStr = '')
	Local $sName_To_IP = TCPNameToIP($sHost)
	Local $iSocket = TCPConnect($sName_To_IP, 80)
	
	If $iSocket = -1 Then
		Return SetError(1)
	EndIf
	
	Local $sCommand = "GET " & $sPage & " HTTP/1.1" & @CRLF
	
	$sCommand &= "Host: " & $sHost & @CRLF
	$sCommand &= "User-Agent: AutoIt/" & @AutoItVersion & @CRLF
	$sCommand &= "Referer: " & $sHost & @CRLF
	$sCommand &= "Connection: close" & @CRLF & @CRLF
	
	Local $iBytesSent = TCPSend($iSocket, $sCommand)
	
	If $iBytesSent = 0 Then
		Return SetError(2)
	EndIf
	
	Local $sRecv = "", $sRcv
	
	While 1
		$sRcv = TCPRecv($iSocket, 1024, 1)
		
		If @error <> 0 Then
			ExitLoop
		EndIf
		
		$sRcv = BinaryToString($sRcv)
		
		If $sRcv <> "" Then
			$sRecv &= $sRcv
		EndIf
	WEnd
	
	TCPCloseSocket($iSocket)
	
	Return $sRecv
EndFunc


Но в полученном Html присутствуют разрывы кода, где добавляются разные непонятные символы, типа 2a2d, при чём при каждом запросе они разные.
В чём может быть дело?


P.S.
Как видно в примере, если использовать закоментированную строчку с InetRead, то код получается без этих символов.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Единственное в чём вижу разницу, что через InetRead ты читаешь всё сразу одним куском,
а через TCPRecv по килобайту и склеиваешь их сам потом.
Может в этом проблема?
Если попробовать увеличить размер
Код:
$sRcv = TCPRecv($iSocket, 102400, 1)

То таких непонятных символов станет меньше?
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Через WinHTTP тоже всё нормально :scratch:

Код:
ConsoleWrite(_HTTPRead('http://onlinefilmx.ru'))
;ConsoleWrite(BinaryToString(InetRead('http://onlinefilmx.ru')))


Func _HTTPRead($sHost)
    Local $oHTTP = ObjCreate('WinHttp.WinHttpRequest.5.1')
	If IsObj($oHTTP) Then
        $oHTTP.Open('GET', $sHost, False)
        $oHTTP.Send('')
        $oHTTP.WaitForResponse
        Return $oHTTP.Responsetext
	EndIf
EndFunc
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Viktor1703 [?]
Через WinHTTP тоже всё нормально
Да, я в курсе, все методы нормально отдают, а с TCP видимо бага какая то.


OffTopic:
Кстати, тут можно выставлять Referer и User-Agent?
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
OffTopic:
Вроде работает с Referer и User-Agent'ом


Код:
Func _HTTPRead($sHost)
    Local $oHTTP = ObjCreate('WinHttp.WinHttpRequest.5.1')
    If IsObj($oHTTP) Then
        $oHTTP.Open('GET', $sHost, False)
		$oHTTP.SetRequestHeader('Referer', $sHost)
        $oHTTP.SetRequestHeader('User-Agent', 'AutoIt/' & @AutoItVersion)
        $oHTTP.Send('')
        $oHTTP.WaitForResponse
        Return $oHTTP.Responsetext
    EndIf
EndFunc
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Так всё таки что получается, что TCPRecv имеет багу? :scratch:
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Нашлось вроде решение...

Код:
...
Local $sCommand = "GET " & $sPage & " HTTP/1.0" & @CRLF
...


т.е заменить «HTTP/1.1» на «HTTP/1.0».
 
Верх