I want to create a streaming server For multimedia files run on my pc,but i don't have Knowledge for "html" programming.
Ï did some testing but without success
Someone can fix my code source or change it thank you.
Code: Select all
EnableExplicit
Macro ReceiveNetworkData(sock,Buffer,sizebuffer)
recv_(sock, Buffer, sizebuffer,0)
EndMacro
Macro SendNetworkData(sock,Buffer,sizebuffer)
send_(sock, Buffer, sizebuffer,0)
EndMacro
Macro aReq(rang,rang2,lenData)
Ascii("HTTP/1.1 206 OK" + #CRLF$ +
"Server: Test" + #CRLF$ +
"Connection: Keep-Alive" + #CRLF$ +
"Accept-Ranges:bytes" + #CRLF$ +; <== https://developer.mozilla.org/fr/docs/Web/HTTP/Headers/Accept-Ranges
"Content-Range:bytes " + Str(rang) + "-" + Str(lenData-1) +"/" + Str(lenData) + #CRLF$ +
"Content-Lenght: " + Str(lenData-rang) + #CRLF$ +
"Content-Type: application/octet-stream" + #CRLF$ + #CRLF$ )
EndMacro
Structure Http_sendFile
ClientID.i
ClientSysID.i
OpenFileId.i
SizeOffile.q
Seekpos.q
*WorkMem
ConnectionIsClosed.b
EndStructure
Structure listClient
*iHttp_sendFile.Http_sendFile
EndStructure
Global NewList listClient.listClient()
Global HttServerPort.w = 6832
Procedure Http_sendFile(*iHttp_sendFile.Http_sendFile)
With *iHttp_sendFile
Debug "Star snd"
Protected CourPos.q=\Seekpos,SendSize.l,ReadSize.l
Repeat
ReadSize = ReadData(\OpenFileId,\WorkMem,1024*10)
Repeat
If \ConnectionIsClosed = 1
Debug "disc"
Break 2
EndIf
SendSize=SendNetworkData(\ClientSysID,\WorkMem,ReadSize)
If SendSize > 0
If SendSize <> ReadSize
Debug "!!!!!!!!!!!"
EndIf
Break
EndIf
ForEver
CourPos +ReadSize
Until CourPos = \Sizeoffile
Protected *SendReqEnd = Ascii(#CRLF$ + #CRLF$)
If *SendReqEnd
If \ConnectionIsClosed = 0
If SendNetworkData(\ClientSysID,*SendReqEnd,4) < 4
Debug "Error Send SendReqEnd"
EndIf
EndIf
FreeMemory(*SendReqEnd)
EndIf
FreeMemory(\WorkMem)
\ConnectionIsClosed = 2
Debug "End Send File"
EndWith
EndProcedure
Procedure Http_StartsendFile(*iHttp_sendFile.Http_sendFile,File.s)
With *iHttp_sendFile
\WorkMem = AllocateMemory(1024*10)
If Not \WorkMem
ProcedureReturn 0
EndIf
ReceiveNetworkData(\ClientSysID, \WorkMem, 1024*10)
Protected GetReq.s = PeekS(\WorkMem, -1, #PB_UTF8)
If GetReq = #Null$
ProcedureReturn 0
EndIf
FillMemory(\WorkMem,1024*10)
MessageRequester("Get Request",GetReq)
Protected GetRange.s = Mid(GetReq,FindString(GetReq,"Range: bytes=")+Len("Range: bytes="))
GetRange = Mid(GetRange,0,FindString(GetRange,"-")-1)
Protected Range.q = Val(GetRange)
\Seekpos = Range
Debug "Range = " +GetRange
\SizeOffile = FileSize(File)
If \Sizeoffile < 1
Debug "File not Exist"
ProcedureReturn 0
EndIf
\OpenFileId= ReadFile(#PB_Any,File)
If \OpenFileId =0
ProcedureReturn 0
EndIf
FileSeek( \OpenFileId,\Seekpos)
Debug "Size Of File = " + Str(\Sizeoffile)
Protected *SendReq = aReq(Range,0,\SizeOffile)
If *SendReq
Protected reqz.l=MemorySize(*SendReq)
If SendNetworkData(\ClientSysID,*SendReq,reqz) <> reqz
FreeMemory(*SendReq)
ProcedureReturn 0
EndIf
FreeMemory(*SendReq)
Else
ProcedureReturn 0
EndIf
If CreateThread(@Http_sendFile(),*iHttp_sendFile)
ProcedureReturn 1
Else
ProcedureReturn 0
EndIf
EndWith
EndProcedure
If InitNetwork() = 0
MessageRequester("Error", "Can't initialize the network !", 0)
End
EndIf
If CreateNetworkServer(0, HttServerPort)
Global SelecFile.s = OpenFileRequester("Select a file...","","music|*.mp3|Video|*.avi;*.asf",0)
If SelecFile = #Null$
End
; SelecFile="test.mp3"
EndIf
MessageRequester("Hi " + UserName(),"Your Streaming Link : "+ #CRLF$ + #CRLF$ +
"http://127.0.0.1: " + Str(HttServerPort)+ "/Noting" + #CRLF$ +
"Or " + #CRLF$ +
"http://Your external Ip: " + Str(HttServerPort)+ "/Noting" + #CRLF$ +
"Click Ok To Start" )
Define SEvent,ClientID,*iHttp_sendFile.Http_sendFile
Repeat
Delay(10)
ForEach listClient()
If listClient()\iHttp_sendFile\ConnectionIsClosed = 2
FreeMemory(listClient()\iHttp_sendFile)
DeleteElement(listClient())
EndIf
Next
SEvent = NetworkServerEvent()
If SEvent
ClientID = EventClient()
Select SEvent
Case #PB_NetworkEvent_Connect
Case #PB_NetworkEvent_Data
*iHttp_sendFile = AllocateMemory(SizeOf(Http_sendFile))
If *iHttp_sendFile
With *iHttp_sendFile
\ClientSysID = ConnectionID(ClientID)
\ClientID = ClientID
If Http_StartsendFile(*iHttp_sendFile,SelecFile) =1
AddElement(listClient())
listClient()\iHttp_sendFile=*iHttp_sendFile
Else
If \WorkMem
FreeMemory(\WorkMem)
EndIf
CloseNetworkConnection(ClientID)
EndIf
EndWith
Else
CloseNetworkConnection(ClientID)
EndIf
Case #PB_NetworkEvent_Disconnect
ForEach listClient()
If ClientID = listClient()\iHttp_sendFile\ClientID
listClient()\iHttp_sendFile\ConnectionIsClosed=1
Break
EndIf
Next
EndSelect
EndIf
ForEver
Else
MessageRequester("Error", "Can't create the server (port in use ?).", 0)
EndIf