Здравствуте!
Подскажите, как при помощи сокетов и GET POST запросов можно получить содержимое страницы?
Работа с сокетами.
Сообщений 1 страница 8 из 8
Поделиться110.12.2012 12:19:27
Поделиться210.12.2012 14:40:54
Вот GET запрос.
InitNetwork()
EnableExplicit
#server_protocol = "HTTP/1.0"
#server = "purebasic.com"
#server_port = 80
#buffer_size = 4096
#time_for_get_new = 20000
#delay_part = 25
#content_file = 0
Define connection_id.i = OpenNetworkConnection(#server, #server_port, #PB_Network_TCP)
If connection_id <> 0
Define string_to_send.s = "GET /download.php " + #server_protocol + #CRLF$
string_to_send + "Host: " + #server + #CRLF$
string_to_send + "Connection: Close" + #CRLF$ + #CRLF$
SendNetworkString(connection_id , string_to_send)
Define time_current.i = ElapsedMilliseconds()
Define time_limit.i = time_current + #time_for_get_new
Define final_of_transmission.i = 0
Repeat
Select NetworkClientEvent(connection_id)
Case #PB_NetworkEvent_Data
Repeat
Define *memory_buffer = AllocateMemory(#buffer_size)
Define received_size.i = ReceiveNetworkData(connection_id, *memory_buffer, #buffer_size)
Debug received_size
If received_size = -1 Or received_size = 0
FreeMemory(*memory_buffer)
final_of_transmission.i = 1
Break
Else
Define received_size_global.i
received_size_global + received_size
Define *memory_global = ReAllocateMemory(*memory_global, received_size_global)
CopyMemory(*memory_buffer, *memory_global + (received_size_global - received_size), received_size)
FreeMemory(*memory_buffer)
EndIf
ForEver
EndSelect
If final_of_transmission = 1
CloseNetworkConnection(connection_id)
Define content.s = PeekS(*memory_global, received_size_global)
FreeMemory(*memory_global)
Debug content
Debug "Done!"
If CreateFile(#content_file, "D:\file2.txt")
WriteString(#content_file, content)
CloseFile(#content_file)
EndIf
Break
Else
time_current = ElapsedMilliseconds()
If time_current > time_limit
Debug "timeout"
CloseNetworkConnection(connection_id)
Break
Else
Delay(#delay_part)
EndIf
EndIf
ForEver
EndIfВзято с форума. http://purebasic.info/phpBB2/viewtopic.php?t=2373
Поделиться310.12.2012 15:35:25
Вот чуть лучше код:
EnableExplicit
#server_ip = "ya.ru"
#server_host = "www.ya.ru"
#server_port = 80
#server_protocol = "HTTP/1.0"
#delay_part = 25
InitNetwork()
Procedure get_server_data(time_for_update.i, buffer_size.i)
Protected connection_id.i = OpenNetworkConnection(#server_ip, #server_port, #PB_Network_TCP)
If connection_id <> 0
Protected string_to_send.s = "GET / " + #server_protocol + #CRLF$
string_to_send + "Host: " + #server_host + #CRLF$
string_to_send + "Connection: Close" + #CRLF$ + #CRLF$
SendNetworkString(connection_id , string_to_send)
Protected time_current.i = ElapsedMilliseconds()
Protected time_limit.i = time_current + time_for_update
Protected final_of_transmission.i = 0
Define content.s
Repeat
Select NetworkClientEvent(connection_id)
Case #PB_NetworkEvent_Data
Repeat
Protected *memory_buffer = AllocateMemory(buffer_size)
Protected received_size.i = ReceiveNetworkData(connection_id, *memory_buffer, buffer_size)
Debug received_size
If received_size = -1 Or received_size = 0
FreeMemory(*memory_buffer)
final_of_transmission.i = 1
Break
Else
Protected received_size_global.i
received_size_global + received_size
Protected *memory_global = ReAllocateMemory(*memory_global, received_size_global)
CopyMemory(*memory_buffer, *memory_global + (received_size_global - received_size), received_size)
FreeMemory(*memory_buffer)
EndIf
ForEver
EndSelect
If final_of_transmission > 0
CloseNetworkConnection(connection_id)
content = PeekS(*memory_global, received_size_global)
FreeMemory(*memory_global)
Debug "Done!"
Debug content
Break
Else
;timeout check call
time_current = ElapsedMilliseconds()
If time_current > time_limit
;status is timeout (server not responge)
CloseNetworkConnection(connection_id)
Debug "TimeOut!"
Break
Else
Delay(#delay_part)
EndIf
EndIf
ForEver
Else
Debug "Can not connect!"
EndIf
EndProcedure
get_server_data(10000, 4096)Поделиться410.12.2012 15:39:00
Пётр
Спасибо конечно, но это не на сокетах. А мне именно через сокеты надо.
Поделиться510.12.2012 19:15:32
но это не на сокетах.
Нужно обязательно на WinAPI?
В коде выше, использованы функции, являющиеся оберткой над сокетами.
Поделиться610.12.2012 23:11:22
Да, нужно на WinAPI, чтобы можно было контролировать ошибки сокетов и ошибки подключения, и конечно чтобы можно было работать с синхронными и асинхронными сокетами.
Поделиться710.12.2012 23:53:04
чтобы можно было контролировать ошибки сокетов
DisableDebugger
InitNetwork()
Connect=OpenNetworkConnection("google.ru",80)
If Connect
CloseNetworkConnection(Connect)
Bytes = SendNetworkData(Connect, 0, 0)
If Bytes<0
ErrorCode=WSAGetLastError_()
If ErrorCode
ErrorBuffer$ = Space(255)
FormatMessage_(#FORMAT_MESSAGE_FROM_SYSTEM, 0, ErrorCode, 0, @ErrorBuffer$, Len(ErrorBuffer$), 0)
MessageRequester("ошибка "+Str(ErrorCode), ErrorBuffer$, 16)
EndIf
EndIf
EndIfПоделиться818.01.2013 10:50:29
Пётр
Спасибо. А подскажите пожалуйста как сделать чтобы сокеты работали через SSL/TLS соединение?
Похожие темы
| Просмотрщик CHM-файлов. | PureBasic для Linux | 16.01.2025 |
| Web-приложение. | PureBasic для Linux | 05.05.2011 |