ReceiveNetworkString()
Verfasst: 08.10.2005 13:58
hier ist sie, meine erste assemblergeburt
mich hat an ReceiveNetworkData() so sehr gestört, dass man keine wirklich schöne rundum passende schleife basteln kann, dass ich mir nun mein eigenes ReceiveNetworkString() gebastelt habe. es benötigt NUR die ServerID und den *buffer, in welchen direkt geschrieben wird - nicht erst in einen zwischenbuffer. zu empfangen wird immer in der größe des verbleibenden *buffer-platzes versucht. die anzahl der schleifendurchläufe ist somit auf das absolute minimum begrenzt. rückgabewert ist die anzahl der empfangenen bytes.
man beachte die abfragen ob PB_Len und _ReceiveNetworkData bereits deklariert sind. "undefined symbol" oder "symbol already defined" - fehler gehören damit der vergangenheit an.
so, und jetzt huldigt mir!

mich hat an ReceiveNetworkData() so sehr gestört, dass man keine wirklich schöne rundum passende schleife basteln kann, dass ich mir nun mein eigenes ReceiveNetworkString() gebastelt habe. es benötigt NUR die ServerID und den *buffer, in welchen direkt geschrieben wird - nicht erst in einen zwischenbuffer. zu empfangen wird immer in der größe des verbleibenden *buffer-platzes versucht. die anzahl der schleifendurchläufe ist somit auf das absolute minimum begrenzt. rückgabewert ist die anzahl der empfangenen bytes.
Code: Alles auswählen
Procedure ReceiveNetworkString(ServerID, *Buffer)
!ServerID equ Esp
!Buffer equ Esp + 4
!Len equ Esp + 8
!Result equ Esp + 12
Len.l
!If ~ defined PB_Len | defined @f
!extrn PB_Len
!@@:
!End If
!If ~ defined _PB_ReceiveNetworkData@12 | defined @f
!extrn _PB_ReceiveNetworkData@12
!@@:
!End If
!MOV Eax, dword [Buffer]
!CALL PB_Len
!MOV dword [Len], Eax
!MOV dword [Result], Eax
!@@:
!PUSH dword [Len]
!PUSH dword [Buffer + 4]
!PUSH dword [ServerID + 8]
!CALL _PB_ReceiveNetworkData@12
!CMP Eax, 0
!JE @f
!SUB dword [Len], Eax
!CMP dword [Len], 0
!JE @f
!ADD dword [Buffer], Eax
!JMP @b
!@@:
!MOV Eax, dword [Len]
!SUB dword [Result], Eax
ProcedureReturn Result
!Restore ServerID
!Restore Buffer
!Restore Result
!Restore Len
EndProcedure
InitNetwork()
;
Host$ = "www.purearea.net"
;
If PeekL(PokeL(@ServerID, OpenNetworkConnection(Host$, 80))) = 0 : MessageRequester("", "cant't connect ''" + Host$ + "''") : End : Else
If SendNetworkString(ServerID, "GET / HTTP/1.1" + #CRLF$ + "Host: " + Host$ + #CRLF$ + #CRLF$ )
Response$ = Space(10000)
MessageRequester(Str(ReceiveNetworkString(ServerID, @Response$)), Response$)
EndIf
EndIf
so, und jetzt huldigt mir!
