Seite 3 von 3

Verfasst: 27.11.2008 12:15
von Thalius
da ich mal annehme das ganze ist für embedded zwecke - bau dir eine funktion die URL get variablen respektive HTTP-POST verarbeiten kann.

http://developers.sun.com/mobility/midp/ttips/HTTPPost/

und damit kannst du dann deine session oder variablen austauschen.

Cheers, Thalius

Verfasst: 27.11.2008 15:16
von mar
Hi . Um ein paar HTML Kenntnisse wirst du nicht drumherum kommen.
Den Code poste ich, damit PureBasic auch mal eines Tages auf embedded läuft :-) Wär echt super. Vielleicht geht das ja auch - nur nicht direct und ohne Grafik und ASM über C einbinden???

Hier ein Codeschnipsel. Wahrscheinlich muss man doch gosub benutzen. Irgendwie ist es jetzt einen tick langsamer :-(

Ein Verzeichnis "www" musst du noch anlegen und dort alle html-Dateien hineinschubsen. Bilder wirst du vielleicht selber haben :-). Viel Spaß beim durchsuchen vom POST string.

Marcus

Code: Alles auswählen

;
; ------------------------------------------------------------
;
;       Atomic Web Server in PureBasic by AlphaSND
;
;           (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;
; 25/03/2001
;   Added path relative feature. It can be started everywhere
;   Added the window to kill it easely
;
; 19/03/2001
;   Added some new features (clients closed automatically)
;
; 17/03/2001
;   First version.
;
Global ClientID.l
Global EOL$

Procedure.l BuildRequestHeader(*Buffer, DataLength.l, ContentType$)

  Length = PokeS(*Buffer, "HTTP/1.1 200 OK"+EOL$)                     : *Buffer+Length
  Length = PokeS(*Buffer, "Date: Wed, 07 Aug 1996 11:15:43 GMT"+EOL$) : *Buffer+Length
  Length = PokeS(*Buffer, "Server: Atomic Web Server 0.2b"+EOL$)      : *Buffer+Length
  Length = PokeS(*Buffer, "Content-Length: "+Str(DataLength)+EOL$)    : *Buffer+Length
  Length = PokeS(*Buffer, "Content-Type: "+ContentType$+EOL$)         : *Buffer+Length
  Length = PokeS(*Buffer, EOL$)                                       : *Buffer+Length

  ProcedureReturn *Buffer
EndProcedure

Procedure SendHTMLPagePlainType(BaseDirectory$,RequestedFile$)
        If ReadFile(0, BaseDirectory$+RequestedFile$)
          FileLength = Lof(0)
          ContentType$ = "text/html"

          *FileBuffer   = AllocateMemory(FileLength+200)
          *BufferOffset = BuildRequestHeader(*FileBuffer, FileLength, ContentType$)

          ReadData(0, *BufferOffset, FileLength)
          CloseFile(0)
   
          SendNetworkData(ClientID, *FileBuffer, *BufferOffset-*FileBuffer+FileLength)
          FreeMemory(*FileBuffer)
        ProcedureReturn #True
     EndIf
  ProcedureReturn #False
EndProcedure

Procedure SendHTMLPageWithContentType(BaseDirectory$,RequestedFile$)
    If ReadFile(0, BaseDirectory$+RequestedFile$)
      
        FileLength = Lof(0)

        Select Right(RequestedFile$,4)
          Case ".gif"
            ContentType$ = "image/gif"

          Case ".jpg"
            ContentType$ = "image/jpeg"

          Case ".txt"
            ContentType$ = "text/plain"

          Case ".zip"
            ContentType$ = "application/zip"

          Default
            ContentType$ = "text/html"

        EndSelect
        
        *FileBuffer   = AllocateMemory(FileLength+200)
        *BufferOffset = BuildRequestHeader(*FileBuffer, FileLength, ContentType$)

        ReadData(0, *BufferOffset, FileLength)

        CloseFile(0)
 
        SendNetworkData(ClientID, *FileBuffer, *BufferOffset-*FileBuffer+FileLength)
        FreeMemory(*FileBuffer)
        ProcedureReturn #True
     EndIf
  ProcedureReturn #False
EndProcedure

Structure tmp
           a.b
EndStructure

Procedure.s ScanPostData(a$, DefaultPage$)
    MaxPosition = FindString(a$, Chr(13), 5)
    Position = FindString(a$, " ", 5)
    If Position < MaxPosition
      RequestedFile$ = Mid(a$, 6, Position-5)      ; Automatically remove the leading '/'
      RequestedFile$ = RTrim(RequestedFile$)
    Else
      RequestedFile$ = Mid(a$, 6, MaxPosition-5)   ; When a command like 'GET /' is sent..
    EndIf

    If RequestedFile$ = ""
        RequestedFile$ = DefaultPage$
    Else
        *t.tmp = @RequestedFile$
        While *t\a <> 0
          If *t\a = '/' : *t\a = '\' : EndIf
          *t+1
        Wend
    EndIf
  ProcedureReturn RequestedFile$
EndProcedure


Procedure ProcessRequest(BaseDirectory$, RequestedFile$, a$)
  If Left(a$, 3) = "GET"
     If SendHTMLPageWithContentType(BaseDirectory$,RequestedFile$)=#False
        SendHTMLPagePlainType(BaseDirectory$, "AtomicWebServer_Error.html")
      EndIf
  ElseIf Left(a$, 4) = "POST"
      If SendHTMLPageWithContentType(BaseDirectory$,"Index3.html")=#False
        SendHTMLPagePlainType(BaseDirectory$, "AtomicWebServer_Error.html")
      EndIf

  EndIf
EndProcedure

If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf

Port = 80
BaseDirectory$ = "www/"
DefaultPage$   = "Index.html"
AtomicTitle$   = "Atomic Web Server v1.0"

EOL$ = Chr(13)+Chr(10)

*Buffer = AllocateMemory(10000)

If CreateNetworkServer(0, Port)

  OpenWindow(0, 100, 200, 230, 0, "Atomic Web Server (Port "+Str(Port)+")")
  
  Repeat
    
    Repeat
      WEvent = WindowEvent()

      If WEvent = #PB_Event_CloseWindow : Quit = 1 : EndIf
    Until WEvent = 0
    
    SEvent = NetworkServerEvent()
  
    If SEvent
      ClientID.l = EventClient()
  
      Select SEvent
      
        Case 1  ; When a new client has been connected...
          
        Case 4  ; When a client has closed the connection...
  
        Default
          RequestLength.l = ReceiveNetworkData(ClientID, *Buffer, 2000)
           a$ = PeekS(*Buffer)
           RequestedFile$ = ScanPostData(a$, DefaultPage$)
           ProcessRequest(BaseDirectory$, RequestedFile$, a$)
      EndSelect

    Else
      Delay(20)  ; Don't stole the whole CPU !
    EndIf
    
  Until Quit = 1 
    
  CloseNetworkServer(0)
Else
  MessageRequester(AtomicTitle$, "Error: can't create the server (port in use ?).", 0)
EndIf
  
End 
Index.html

Code: Alles auswählen

<HTML>
  <CENTER>
  Atomic Web Server v0.2</H2>
  <font color="red">Welcome !</font> This is the default page.
  <H2><a href="Index2.html"><img src="chumon1.jpg" width="481" height="413" alt="" border="0"></a>
  </CENTER>
<form action='get' method='post'> <!-- ?suche=&sort= weglasen, ist sinnlos... method='post' beschreibt das übermitteln der Daten per $_POST[""]-->
<input type='text' name='suche' value='meine Variable' /><br /><!-- Hier kann der User den Text eingeben der Mittels der Variable "suche" übergeben wird-->
<input type='submit' value='Ändern'  />
</form> 
</HTML>
Index2.html

Code: Alles auswählen

<HTML>
  <CENTER>
  Atomic Web Server v0.2</H2>
  <font color="red">Welcome !</font> This is the default page.
  <H2><a href="Index.html"><img src="chumon2.jpg" width="481" height="413" alt="" border="0"></a>
  </CENTER>
</HTML>
Index3.html

Code: Alles auswählen

<HTML>
  <CENTER>
  Atomic Web Server v0.2</H2>
  <font color="red">Welcome !</font> This is the default page.
  <H2><a href="Index.html"><img src="blauhut1.jpg" width="481" height="413" alt="" border="0"></a>
  </CENTER>
</HTML>
AtomicWebServer_Error.html

Code: Alles auswählen

<HTML>
  <CENTER>
  <H2>Atomic Web Server v0.2</H2>
  <font color="red">Error 404:</font> Requested file not found.
  </CENTER>
</HTML>

Verfasst: 27.11.2008 20:33
von dl5ndh
Hallo,
auf dem einfacheren Weg kannst Du das mit der Datei port.dll
machen, findest über Google. Ist auch beschrieben, was man zum
senden über und empfangen über den COM-Port eingeben muss. <)

Verfasst: 27.11.2008 21:44
von Thalius
btw es gibt embedded x86 und PB/Linux läuft darauf ;)

http://www.pcengines.ch/alix.htm

Cheers,
Thalius

Verfasst: 28.11.2008 14:19
von mar
@Thalius ich meine MMU-less embedded mit richtigem flat-binary ausführbaren Code. Ein Linux für MMU-less soll sogar auf richtigen Systemen viel schneller sein ca. 20 % oder mehr.

-- im Moment teste ich nen anderen irrlichtwrapper für PB --

Hier noch ein Beispiel, damit wir nicht off Topic laufen Smile

ist in C und HTML zum Ansteuern von einiger Hardware.
Natürlich läuft das nur aufm DE2 Nios Board.
Aber der Code ist recht einfach in PB nachzuahmen.

http://nioswiki.jot.com/WikiHome/Operat ... 9322778364

Mar

Verfasst: 28.11.2008 16:01
von Thalius
CGI mit nem Apache oder LHTTP geht auch von PB wenns direkt machen willst. Evtl einfacher. Im engl. gabs da paar Beispiele iirc.

ja die ALIX sind halt ideal zb fuer router oder firewall / mini-PBX Lösungen.
mmu less ist dann halt noch a bissl kleiner :)

ot:
zum IW -> den von drac ? heh

Cheers,
Thalius

Verfasst: 29.11.2008 03:36
von mar
sorry only ot:
Ich versuche den Wrapper von irrnetcp zu nehmen. Schwierigkeiten gibt es bis jetzt nur mit den ganzem Strukturen, die ich haben will :-).
Mar