Здравствуте!
Подскажите, как при помощи сокетов и 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 |