PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » Работа с сокетами.


Работа с сокетами.

Сообщений 1 страница 8 из 8

1

Здравствуте!
Подскажите, как при помощи сокетов и GET POST запросов можно получить содержимое страницы?

0

2

Вот 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

0

3

Вот чуть лучше код:

Код:
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)

0

4

Пётр
Спасибо конечно, но это не на сокетах. А мне именно через сокеты надо.

0

5

Katty написал(а):

но это не на сокетах.

Нужно обязательно на WinAPI?

В коде выше, использованы функции, являющиеся оберткой над сокетами.

0

6

Да, нужно на WinAPI, чтобы можно было контролировать ошибки сокетов и ошибки подключения, и конечно чтобы можно было работать с синхронными и асинхронными сокетами.

0

7

Katty написал(а):

чтобы можно было контролировать ошибки сокетов

Код:
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

0

8

Пётр
Спасибо. А подскажите пожалуйста как сделать чтобы сокеты работали через SSL/TLS соединение?

0

Похожие темы


Вы здесь » PureBasic - форум » PureBasic для Windows » Работа с сокетами.