|
PureBasic Мощный кросс-платформенный язык среднего уровня на основе BASIC. Подходит для решения широкого круга задач. |
05.04.2009, 18:54
|
#1
|
Нуждающийся
Регистрация: 05.07.2008
Сообщений: 53
Написано 6 полезных сообщений (для 7 пользователей)
|
Прокси.
Народ, может кто-нить пояснить, как слать пакеты через прокси? Если быть точнее, то пост запросы. Ну очень надо.
__________________
...
|
(Offline)
|
|
08.05.2009, 06:13
|
#2
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,358
Написано 2,472 полезных сообщений (для 6,854 пользователей)
|
Ответ: Прокси.
<? $proxy = "1.1.1.1"; $port = "8080"; $fp = fsockopen($proxy, $port, $errno, $errstr, 30); if($fp) { $data = "post=ok"; $headers = "POST $path HTTP/1.1\r\n"; $headers .= "Host: $hostname\r\n"; $headers .= "Content-type: application/x-www-form-urlencoded\r\n"; $headers .= "Content-Length: ".strlen($data)."\r\n"; $headers .= "Connection: close\r\n\r\n"; $fw = fwrite($fp, $headers.$data); fclose($fp); } else die; ?>
Это у нас на php.
Аналогию думаю не трудно реализовать и на любом другом языке.
Значит так...
заранее говорю что не знаю какие команды по этой теме есть в PB, да и вобще я его в глаза не видел ни разу.
после директивы HOST: заместо $hostname ставь хост.
$path - путь до штукидрюки в которую данные посылаем.
strlen($data) - меняем на размер посылаемых данных (len() length())
После посылки запроса читай прямо из этого сокета и будет всё ок.
ЗЫ Переборщик пишешь?
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
Последний раз редактировалось Randomize, 08.05.2009 в 06:19.
|
(Offline)
|
|
08.05.2009, 16:58
|
#3
|
Нуждающийся
Регистрация: 05.07.2008
Сообщений: 53
Написано 6 полезных сообщений (для 7 пользователей)
|
Ответ: Прокси.
Спс.
Нет, просто было интересно.
З.Ы. Вот интересный пример, может кому пригодится.
; English forum: http://www.purebasic.fr/english/viewtopic.php?t=13520
; Author: HeX0R
; Date: 28. December 2004
; OS: Windows
; Demo: No
; http, SOCKS4,5 - Proxy-Connection
; ---------------------------------
; The user / pass - authorization is untested, cause it's really difficult
; to find such proxys.
; User comment: "Invaluable for networking apps where you may need to connect
; via a user defined proxy like an IRC client...."
;+----------------------------------+
; Proxy_Connect
;
; (c)HeX0R 2004
;
; Procedure for giving your online-applications the
; possibility to connect through different proxys
; like http, socks4 and socks5.
;
; NOT meant for connecting to websites!
; For this check Num3's example here:
; http://purebasic.myforums.net/viewtopic.php?t=10327
;
;+----------------------------------+
InitNetwork()
Procedure.l IsIP( ip.s )
;ReturnValues :
;0 = no ip
;1 = IPv4 - IP
;2 = IPv6 - IP
count.l = CountString(ip, ".")
If count = 3
ret.l = 1
ElseIf count = 5
ret.l = 2
Else
ProcedureReturn 0
EndIf
For i = 0 To count
a$ = StringField(ip, i + 1, ".")
If a$ = "" Or Str(Val(a$)) <> a$ Or Val(a$) > 255 Or Val(a$) < 0
ProcedureReturn 0
EndIf
Next i
ProcedureReturn ret
EndProcedure
Procedure.l Proxy_Connect( proxy_ip.s, proxy_port.l, ip_to_connect.s, port_to_connect.l, type.l, username.s, userpass.s, timeout.l )
;proxy_ip = IP or URL of the Proxy-Server
;proxy_port = Port of the Proxy-Server
;ip_to_connect = IP or URL of where you want to connect through proxy. ATTENTION:
; SOCKS4 only supports IP in IPv4-format! You have to get the IP first before using this on urls, otherwise it will fail!
;port_to_connect = Port of where you want to connect through proxy
;type = 0 -> http-proxy
;type = 1 -> socks4-proxy
;type = 2 -> socks5-proxy
;If no authorization is needed set username and userpass = ""
;timeout -> Time after connection-trial will time out (in SECONDS)
;Return-Value = 0 -> error ; Return-Value > 0 -> ConnectionID
*buffer = AllocateMemory(1024)
If *buffer = 0
ProcedureReturn #False
EndIf
netid.l = OpenNetworkConnection(proxy_ip, proxy_port)
If netid = 0
FreeMemory(*buffer)
ProcedureReturn #False
EndIf
Select type
Case 0
;====================
;-HTTP - Proxy
;====================
;Based on Num3's http-proxy-snippet , THX! ->
;http://purebasic.myforums.net/viewtopic.php?t=10327
text$ = "CONNECT " + ip_to_connect + ":" + Str(port_to_connect) + " HTTP/1.0" + #CRLF$
If username And userpass
user$ = username + ":" + userpass
length.l = Len(user$) * 2
If length < 64
length = 64
EndIf
Base64Encoder(@user$, Len(user$), *buffer, length)
encoded$ = PeekS(*buffer)
text$ + "Authorization: Basic " + encoded$ + #CRLF$
text$ + "Proxy-Authorization: Basic " + encoded$ + #CRLF$
EndIf
text$ + #CRLF$
SendNetworkData(netid, @text$, Len(text$))
check_timeout.l = ElapsedMilliseconds() + ( timeout * 1000 )
Repeat
Delay(10)
If NetworkClientEvent(netid) = 2
Content$ = Space(14500)
length.l = ReceiveNetworkData(netid, @Content$, 14500)
While length = 14500
;Clear Input-Buffer
length = ReceiveNetworkData(netid, *buffer, 14500)
Wend
Break
EndIf
Until check_timeout < ElapsedMilliseconds()
Result.l = 0
For i = 1 To CountString(Content$, Chr(10))
a$ = Trim(StringField(Content$, i, Chr(10)))
If Left(a$, 7) = "HTTP/1."
Result = Val(StringField(Content$, 2, Chr(32)))
Break
EndIf
Next i
If check_timeout < ElapsedMilliseconds() Or Result <> 200
FreeMemory(*buffer)
CloseNetworkConnection(netid)
ProcedureReturn #False
EndIf
FreeMemory(*buffer)
ProcedureReturn netid
Case 1
;====================
;-Socks4 - Proxy
;====================
;Socks4 only supports IPv4 !
;You have to do a DNS-Lookup before using this on urls, otherwise it will fail!
If IsIP(ip_to_connect) <> 1
FreeMemory(*buffer)
CloseNetworkConnection(netid)
ProcedureReturn #False
EndIf
;-Phase 1 SOCK4
;Send Request
PokeB(*buffer, 4)
PokeB(*buffer + 1, 1)
hi.l = Int(port_to_connect / 256)
lo.l = port_to_connect - (256 * hi)
PokeB(*buffer + 2, hi)
PokeB(*buffer + 3, lo)
For i = 1 To 4
PokeB(*buffer + 3 + i, Val(StringField(ip_to_connect, i, ".")) & 255)
Next i
PokeS(*buffer + 8, username)
length.l = 9 + Len(username)
SendNetworkData(netid, *buffer, length)
;Check if connection is established
check_timeout.l = ElapsedMilliseconds() + ( timeout * 1000 )
Repeat
Delay(10)
If NetworkClientEvent(netid) = 2
ReceiveNetworkData(netid, *buffer, 1024)
ver.l = PeekB(*buffer) & 255
CD.l = PeekB(*buffer + 1) & 255
port.l = (PeekB(*buffer + 2) & 255) * 256
port + (PeekB(*buffer + 3) & 255)
ip.s = Str(PeekB(*buffer + 4) & 255) + "." + Str(PeekB(*buffer + 5) & 255) + "."
ip + Str(PeekB(*buffer + 6) & 255) + "." + Str(PeekB(*buffer + 7) & 255)
Break
EndIf
Until check_timeout < ElapsedMilliseconds()
If check_timeout < ElapsedMilliseconds() Or ver <> 0 Or CD <> 90
FreeMemory(*buffer)
CloseNetworkConnection(netid)
ProcedureReturn #False
EndIf
;IP and Port should be the same like ip_to_connect/port_to_connect and is just for information
Debug "Connected to IP:" + ip
Debug "Connected to Port:" + Str(port)
FreeMemory(*buffer)
ProcedureReturn netid
Case 2
;====================
;-Socks5 - Proxy
;====================
;-Phase 1 SOCK5
;Send wished method
If username = "" And userpass = ""
length.l = 3
PokeB(*buffer, 5)
PokeB(*buffer + 1, 1)
PokeB(*buffer + 2, 0)
Else
length.l = 4
PokeB(*buffer, 5)
PokeB(*buffer + 1, 2)
PokeB(*buffer + 2, 0)
PokeB(*buffer + 3, 2)
EndIf
SendNetworkData(netid, *buffer, length)
;Check if method is allowed
check_timeout.l = ElapsedMilliseconds() + ( timeout * 1000 )
Repeat
Delay(10)
If NetworkClientEvent(netid) = 2
ReceiveNetworkData(netid, *buffer, 2)
ver.l = PeekB(*buffer) & 255
method.l = PeekB(*buffer + 1) & 255
Break
EndIf
Until check_timeout < ElapsedMilliseconds()
If check_timeout < ElapsedMilliseconds() Or ver <> 5 Or method = 255
FreeMemory(*buffer)
CloseNetworkConnection(netid)
ProcedureReturn #False
EndIf
If method = 2
;-Phase 2 SOCK5
;Send Username/Password (if allowed)
PokeB(*buffer, 1)
PokeB(*buffer + 1, Len(username))
PokeS(*buffer + 2, username)
k = 2 + Len(username)
PokeB(*buffer + k, Len(userpass))
PokeS(*buffer + k + 1, userpass)
SendNetworkData(netid, *buffer, Len(userpass) + 1 + k)
;Check if Username/Password is accepted
check_timeout.l = ElapsedMilliseconds() + ( timeout * 1000 )
Repeat
Delay(10)
If NetworkClientEvent(netid) = 2
ReceiveNetworkData(netid, *buffer, 2)
passver.l = PeekB(*buffer) & 255
status.l = PeekB(*buffer + 1) & 255
Break
EndIf
Until check_timeout < ElapsedMilliseconds()
If check_timeout < ElapsedMilliseconds() Or passver <> 1 Or status <> 0
FreeMemory(*buffer)
CloseNetworkConnection(netid)
ProcedureReturn #False
EndIf
EndIf
;-Phase 3 SOCK5
;Send Connect-Request
PokeB(*buffer, 5)
PokeB(*buffer + 1, 1)
PokeB(*buffer + 2, 0)
Select IsIP( ip_to_connect )
Case 0
PokeB(*buffer + 3, 3)
PokeB(*buffer + 4, Len(ip_to_connect))
For i = 1 To Len(ip_to_connect)
PokeB(*buffer + 4 + i, Asc(Mid(ip_to_connect, i, 1)))
Next i
cont.l = 4 + i
Case 1
PokeB(*buffer + 3, 1)
For i = 1 To 4
PokeB(*buffer + 3 + i, Val(StringField(ip_to_connect, i, ".")) & 255)
Next i
cont.l = 8
Case 2
PokeB(*buffer + 3, 4)
For i = 1 To 6
PokeB(*buffer + 3 + i, Val(StringField(ip_to_connect, i, ".")) & 255)
Next i
cont.l = 10
EndSelect
hi.l = Int(port_to_connect / 256)
lo.l = port_to_connect - (256 * hi)
PokeB(*buffer + cont, hi)
PokeB(*buffer + cont + 1, lo)
SendNetworkData(netid, *buffer, cont + 2)
;Now Check the reply
check_timeout.l = ElapsedMilliseconds() + ( timeout * 1000 )
Repeat
Delay(10)
If NetworkClientEvent(netid) = 2
length.l = ReceiveNetworkData(netid, *buffer, 1024)
ver.l = PeekB(*buffer) & 255
reply.l = PeekB(*buffer + 1) & 255
reserved.l = PeekB(*buffer + 2) & 255
atyp.l = PeekB(*buffer + 3) & 255
Break
EndIf
Until check_timeout < ElapsedMilliseconds()
If check_timeout < ElapsedMilliseconds() Or ver <> 5 Or reply <> 0 Or reserved <> 0
FreeMemory(*buffer)
CloseNetworkConnection(netid)
ProcedureReturn #False
EndIf
Select atyp
Case 1
;IPv4
ip.s = Str(PeekB(*buffer + 4) & 255) + "." + Str(PeekB(*buffer + 5) & 255) + "."
ip + Str(PeekB(*buffer + 6) & 255) + "." + Str(PeekB(*buffer + 7) & 255)
port.l = (PeekB(*buffer + 8) & 255) * 256
port + (PeekB(*buffer + 9) & 255)
Case 3
;Name
ip.s = ""
For i = 1 To (PeekB(*buffer + 4) & 255)
ip + Chr(PeekB(*buffer + 4 + i) & 255)
Next i
port.l = (PeekB(*buffer + 4 + i) & 255) * 256
port + (PeekB(*buffer + 5 + i) & 255)
Case 4
;IPv6
ip.s = Str(PeekB(*buffer + 4) & 255) + "." + Str(PeekB(*buffer + 5) & 255) + "."
ip + Str(PeekB(*buffer + 6) & 255) + "." + Str(PeekB(*buffer + 7) & 255) + "."
ip + Str(PeekB(*buffer + 8) & 255) + "." + Str(PeekB(*buffer + 9) & 255)
port.l = (PeekB(*buffer + 10) & 255) * 256
port + (PeekB(*buffer + 11) & 255)
EndSelect
;Following IP and Port is just for information...
;this is proxy-internal and not necessarily the same as ip_to_connect/port_to_connect
Debug "Internal Proxy-IP:" + ip
Debug "Internal Proxy-Port:" + Str(port)
FreeMemory(*buffer)
ProcedureReturn netid
EndSelect
EndProcedure
Debug Proxy_Connect("80.250.244.179",8080 ,"google.ru", 80,0,"","",3)
__________________
...
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
08.05.2009, 19:16
|
#4
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,358
Написано 2,472 полезных сообщений (для 6,854 пользователей)
|
Ответ: Прокси.
Да тут пример по круче, мягко новоря.
Тут ещё и соксификация.
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Похожие темы
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Связь через прокси |
Progger_Leo |
2D-программирование |
3 |
21.07.2007 22:24 |
Часовой пояс GMT +4, время: 22:50.
|