Что нового

[Сеть, интернет] TCPRecv не возвращает данные

FraidZZ

Новичок
Сообщения
5
Репутация
0
Набросал простейший код, который должен отправить HTTP GET запрос.
Код:
TCPStartup()

$socket = TCPConnect(TCPNameToIP("vk.com"), 80)

ConsoleWrite("IP: " & TCPNameToIP("vk.com") & @CRLF)

$data = "GET / HTTP/1.0"
addLine($data, "User-Agent: Opera/9.80 (Windows NT 6.1) Presto/2.12.388 Version/12.16")
addLine($data, "Host: www.vk.com")
addLine($data, "Accept: */*")
addLine($data, "Accept-Language: ru-RU,ru;q=0.9,en;q=0.8")
addLine($data, "Accept-Encoding: gzip, deflate")
addLine($data, "Cache-Control: no-cache")
addLine($data, "Connection: close")
addLine($data, @CRLF)

$sent = TCPSend($socket, $data)
ConsoleWrite("BytesSent: " & $sent & " from " & StringLen($data) & " total" & @CRLF)
;sleep(5000)

$rcv = ""
while 1
   $r = TCPRecv($socket, 16)
   if $r = "" Then ExitLoop
   $rcv &= $r
WEnd
ConsoleWrite("Error: " & @Error & ", Size: " & StringLen($rcv) & ", Data: " & $rcv & @CRLF)


func addLine(ByRef $main, $data)
   $main &= (@CRLF & $data)
EndFunc


Однако в консоли отладки у меня лишь этот текст:
Код:
IP: 87.240.131.117
BytesSent: 238 from 238 total
Error: 0, Size: 0, Data:

Он показывает, что данные отправлены, но ответа нет. Где я ошибся :stars: ?
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Всправке в примере показано как правильно обращаться с TCPRecv
http://autoit-script.ru/autoit3_docs/functions/TCPRecv.htm
 
Автор
F

FraidZZ

Новичок
Сообщения
5
Репутация
0
Так в том то и дело, что я обмусолил справк вдоль и поперек. До меня что-то не доходит (и мне обидно), но мой упртый мозг отказывается понимать, что. Может, все-таки подскажете?


Добавлено:
Сообщение автоматически объединено:

yep. До меня дошло. TCPRecv выполняется асинхронно и не ждет прихода данных.
Поэтому
Код:
while 1
   $r = TCPRecv($socket, 1)
   if @error Then ExitLoop
   if $r <> "" Then $rcv &= $r
wend
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
FraidZZ
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Администратор.
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Хорошо. Также не рекомендую устанавливать максимальную длину принимаемых данных равным 1 байту. Могут появиться артефакты при приеме, или принести потерю некоторой получаемой информации :smile:
 
Автор
F

FraidZZ

Новичок
Сообщения
5
Репутация
0
Ясно. Поставил буфер 32 байта. Спасибо за помощь! :beer:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Medic84 [?]
не рекомендую устанавливать максимальную длину принимаемых данных равным 1 байту
ИМХО, можно использовать только для отлова заголовка (можно 2) с последующим изменением в большую сторону.
 
Верх