Par rapport à ce que j'ai pu lire:
-Les pipes anonymes permettent l'échange de données entre process seulement sur une machine locale.
-Les pipes nommés et les maislots le permettent en réseau
Je me suis seulement intéressé aux pipes nommés qui sont les plus aboutis.
L'exemple ici n'a de valeur que pour l'expérimentation, j'ai omis volontairement les valeurs de retour de certaines fonctions.
Je n'ai testé ce code qu'en local, si tu veux l'essayer en réseau tu doit changer le chemin du pipe inscrit dans le string.
Normallement on doit doubler les "\" dans le chemin du pipe mais si je le fait, ça ne fonctionne plus! Bizarre.
Exécuter les deux applications,sur le server, faire menu creation d'un pipe nommé puis sur le client clicker sur le bouton.
Le server attend une connection, le client se connecte, envoie un message, le server le lit puis déconnecte le client.
J'espère que ça va t'aider, dis moi si ça marche en réseau!
Application Server:
Code : Tout sélectionner
#PIPE_ACCES_DUPLEX=3
#Gadget=0
Global Buffer_Ecriture.s,Buffer_Lecture.s,Envoie
Buffer_Ecriture=Space(100)
Buffer_Lecture=Space(100)
Procedure Thread_Client(pipe.l)
fConnected = ConnectNamedPipe_(pipe, #Null)
If fConnected
AddGadgetItem(#Gadget, -1, "Un client est connecté")
EndIf
ReadFile_(pipe, @Buffer_Lecture, Len(Buffer_Lecture), @recu, 0)
AddGadgetItem(#Gadget, -1, Buffer_Lecture)
Buffer_Ecriture="Le serveur vous a déconnecté"
WriteFile_(pipe, Buffer_Ecriture, Len(Buffer_Ecriture), @envoye, 0)
FlushFileBuffers_(pipe)
If DisconnectNamedPipe_(pipe)
AddGadgetItem(#Gadget, -1, "Le server est en attente de connexion client")
EndIf
Thread_Client(pipe.l)
EndProcedure
If OpenWindow(0,0,0,600,200,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Server Pipe Nommé") And CreateGadgetList(WindowID(0))
EditorGadget (#Gadget,10,10,580,160,#PB_Container_Raised)
If CreateMenu(0, WindowID())
MenuTitle("Action")
MenuItem( 1, "Créer un pipe nommé")
MenuItem( 2, "Quitter")
EndIf
Repeat
EventID.l = WaitWindowEvent()
Select EventID
Case #PB_EventMenu
Select EventMenuID()
Case 1
Hpipe=CreateNamedPipe_("\\.\pipe\NomDePipe", #PIPE_ACCES_DUPLEX, #PIPE_TYPE_MESSAGE | #PIPE_READMODE_MESSAGE, 1, 100, 100, 3000, #Null)
If Hpipe
AddGadgetItem(#Gadget, -1, "Le server est en attente de connexion client")
Thread=CreateThread(@Thread_Client(),Hpipe)
EndIf
Case 2
Quit = 1
EndSelect
Case #PB_Event_CloseWindow
KillThread(Thread)
CloseHandle_(Hpipe)
Quit = 1
EndSelect
Until Quit = 1
EndIf
Application Client:
Code : Tout sélectionner
#Gadget=0
Global Hpipe
Global Buffer_Ecriture.s,Buffer_Lecture.s
Buffer_Ecriture=Space(100)
Buffer_Lecture=Space(100)
Procedure AppelServer(Texte.s)
lpszPipename.s=GetGadgetText(3)
result=WaitNamedPipe_(lpszPipename, 3000)
Hpipe = CreateFile_( lpszPipename, #GENERIC_READ |#GENERIC_WRITE, 0, #Null, #OPEN_EXISTING,0, #Null)
If Hpipe
Buffer_Ecriture.s=Texte
WriteFile_(Hpipe, Buffer_Ecriture, @Len(Buffer_Ecriture), @envoye, 0)
FlushFileBuffers_(Hpipe)
ReadFile_(Hpipe, @Buffer_Lecture, Len(Buffer_Lecture), @recu, 0)
AddGadgetItem(#Gadget, -1, Buffer_Lecture)
EndIf
CloseHandle_(Hpipe)
EndProcedure
If OpenWindow(0,0,0,600,200,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Client Pipe Nommé") And CreateGadgetList(WindowID(0))
EditorGadget (#Gadget,10,60,580,120,#PB_Container_Raised)
StringGadget(1,10, 36,400,20,"Client: Voici un message")
ButtonGadget(2, 460, 36, 100, 20, "Envoyer")
StringGadget(3,10, 10,400,20,"\\.\pipe\NomDePipe")
TextGadget(4, 420, 10,180,20,"Nom du serveur (Par défaut local ici)")
Repeat
EventID.l = WaitWindowEvent()
Select EventID
Case #PB_EventGadget
Select EventGadgetID()
Case 2
AppelServer(GetGadgetText(1))
EndSelect
Case #PB_Event_CloseWindow
Quit = 1
EndSelect
Until Quit = 1
EndIf