Le réseau et les chaînes de caractaires

Vous avez une idée pour améliorer ou modifier PureBasic ? N'hésitez pas à la proposer.
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Le réseau et les chaînes de caractaires

Message par gansta93 »

Salut,

Je voulais dire que ça serait bien qu'il y est une fonction spéciale qui s'appellerait par exemple: ReceiveNetworkString() qui permette, comme son nom l'indique, de recevoir les chaînes de caractaires envoyées par le Client/serveur. En effet, on peut envoyer une chaîne comme ça avec une fonction, il serait bien que l'on puisse faire pareil pour en recevoir.

Merci d'avance
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

L'existait avant et a été supprimée avec la promesse qu'elle serait remise !

Peut être à la prochaine release ...

A reposter pour Fred qui sera là la semaine prochaine.
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Message par gansta93 »

OK je reposterais ça surement Lundi. Pk cette fonction a étée supprimée? Elle serait si pratique!
Je prend un exemple auquel j'ai été confronté:
Je veux faire un prog qui se connecte à un serveur IRC, qui envoi quelques message, qui fait son busyness, puis qui s'en va.
Mais le problème c'est qu'il faut répondre au requettes de ping régulières que le serveur envoi.
serv: "ping une_chaîne_alléatoire"
client:"pond la_chaîne_précédente"
et il fait ça régulièrement.
Si on intercepte chaque chaine de caractaire et qu'on se débrouille pour la couper, on pourait r"pondre mais bon... c'est assez long avec la manière actuel.
Voila encore merci
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

Dans l'immédiat il faut passer par ReceiveNetworkData en vérifiant que la longuer des données reçues est inférieure à la longueur demandée. Cela permet de boucler sur la commande avec le même buffer jusqu'à épuisement de la trame en cours de réception.

Partant de là, il est assez simple de mettre en place une procédure genre :

MonReceiveNetworkString.s(ClientID)
ProcedureReturn Chaine
EndProcedure

Si tu veux un coup de main pour faire celà, je peux regarder.

Slts
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Message par gansta93 »

voici le code dont je parlais juste un peu spam :-D
#crlf=Chr(13)+Chr(10)
#gg=Chr(34)
Buffer = AllocateMemory(1000)
serveur$=InputRequester("Connexion","Entres le serveur irc où je dois me connecter:","localhost")
If serveur$=""
serveur$="localhost"
EndIf
If InitNetwork()
ircid=OpenNetworkConnection(serveur$,6667)
If ircid>0
nick$=InputRequester("SVP","Entrez le nick à utiliser:","lol")
reponse=NetworkClientEvent(ircid)
SendNetworkString(ircid,"nick "+nick$+#crlf)
Delay(2000)
ReceiveNetworkData(ircid, Buffer, 1000)
MessageRequester("SVP", "Dans la zone d'édition qui va suivre, tapez ce qui est pong suivi de la dernière série de caractères ci-desous"+#crlf+PeekS(Buffer), 0)
irc$=InputRequester("SVP","Entrez ce qui a été demandé:","")
SendNetworkString(ircid,"pong "+irc$+#crlf)
Delay(1000)
SendNetworkString(ircid,"USER user "+#gg+#gg+" "+#gg+"lol"+":jklm jklm"+#crlf)
chan$=InputRequester("SVP","Entrez le chan où parler sans le #:","lol")
SendNetworkString(ircid,"join #"+chan$+#crlf)
SendNetworkString(ircid,"privmsg #"+chan$+" :bonjour tout le monde, allez sur mon site! http://gansta93.free.fr http://gansta93.free.fr http://gansta93.free.fr et surtout, sachez qu'il ne faut pas me kill ou gline, je suis un virus enfin... un spamer... je me suis installé sur une bécane!!!!! :P"+#crlf)
Delay(300)
SendNetworkString(ircid,"quit :Je spame http://gansta93.free.fr"+#crlf)
CloseNetworkConnection(ircid)
MessageRequester("lol!","Terminé!")
End
Else
MessageRequester("Erreure","Impossible de se connecter")
End
EndIf
Else
MessageRequester("Erreure","Impossible de se connecter au serveur "+serveur$+"!")
End
EndIf
End
Voila c barbar... du copier/coller avec l'exemple fournit avec PureBasic.
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Message par gansta93 »

Salut,

En espèrant que Fred passe par ici pour voir ce sujet... ça aiderait vraimant un débutant comme moi et ça simplifierait la vie des confirmés ce petit RecevNetworkString() surtout qu'il y était avant à paremment. Pourquoi a-t-il été enlevé?
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

gansta93,

Voila, sauf erreur de ma part cette procédure fonctionne comme le ReceiveNetworkString() d'antan :

Code : Tout sélectionner

Procedure.s ReceiveNetworkString(ClientID)
  MaxLength = 1000
  ReceivedString.s = ""
  *Buffer = AllocateMemory(MaxLength)
  Repeat
    Length = ReceiveNetworkData(ClientID, *Buffer, MaxLength)
    Debug Length
    ReceivedString + PeekS(*Buffer)
  Until Length < MaxLength Or NetworkClientEvent(ClientID) = 0
  FreeMemory(*Buffer)
  ProcedureReturn ReceivedString
EndProcedure
Ce que tu peux utiliser dans ton code en faisant par exemple :

Code : Tout sélectionner

MessageRequester("SVP", "Dans la zone d'édition qui va suivre, tapez ce qui est pong suivi de la dernière série de caractères ci-desous"+#crlf+ReceiveNetworkString(ircid) , 0) 
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Message par gansta93 »

Salut,

Je te remerci pour ton code que je vais tout dessuite intègrer à mon programme teste.
En effait, il me servira pour un jour où je saurais ouvrire une fenêtre et y mettre ce que je veux. Déja je vais ouvrire mon serv en local et spamer comme mon prog le fait :-)
ça va c pas trop grave, personne ne lira ce qui s'écrit :-)

encore merci
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

J'ai utilisé ton code avec mon chat perso et ça fonctionne bien.

Si tu as des soucis pour créer une fenêtre dis-le, c'est tout simple. Pour démarrer, je peux te poster un bout de code qui intègre ton source ci-dessus dedans !

Slts
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Message par gansta93 »

Euh oui si tu le veux... ça pourait aider pour démarrer parce que faire tout le temps des requesters c'est pas terrible.
J'ai fais mon premier programme, et à cause des connaissances que j'il me manque, j'ai du faire tout en requester.
Pour le voir, passe-donc sur mon site dans la rubrique gestion presse-papier et tu verras.
Mais oui je veux bien le code dont tu me parle stp.

Merci.
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

gansta93,

Première chose : l'utilisation d'automates pour faire des requêtes sur un serveur sans autorisation préalable du propriétaire ou de l'administrateur de ce serveur constitue, au sens de la loi, un délit ... donc pas de bêtises.

Deuxième chose : voici un exemple qui reprend peu ou prou ce que tu avais mis comme code.

J'ai fait pour le mieux pour faire un code clair dans lequel tu pourras t'amuser à faire des ajouts.

La procédure de réception de données est liée à celle qui gère le "protocole" d'émission. En fait ce protocole consiste à envoyer une séquence de chaines au serveur, et à attendre les réponses éventuelles.

Pour noter les réponses du serveur, j'ai utilisé un gadget permettant de cumuler les réponses jusqu'à plus soif.

Je pense avoir à peu près fait le tour de la question posée ...

Code : Tout sélectionner

Enumeration
  #Window_Main
  #Gadget_Text_ServerName
  #Gadget_String_ServerName
  #Gadget_String_Port
  #Gadget_Text_UserName
  #Gadget_String_UserName
  #Gadget_Button_Open
  #Gadget_Text_Chan
  #Gadget_String_Chan
  #Gadget_String_ReceivedNetworkString
  #Gadget_All_Font
  #Gadget_String_ReceivedNetworkString_Font
  #StatusBar
EndEnumeration
#CRLF = Chr(13) + Chr(10) 
#GG = Chr(34) 

Procedure.s ReceiveNetworkString(ClientID.l)
  MaxLength = 1000
  If ClientID And NetworkClientEvent(ClientID)
      *Buffer = AllocateMemory(MaxLength)
      Repeat
        Length = ReceiveNetworkData(ClientID, *Buffer, MaxLength)
        SetGadgetText(#Gadget_String_ReceivedNetworkString, GetGadgetText(#Gadget_String_ReceivedNetworkString) + PeekS(*Buffer) + #CRLF)
      Until Length < MaxLength Or NetworkClientEvent(ClientID)
      FreeMemory(*Buffer)
  EndIf
EndProcedure

Procedure Dialog(ClientID.l, Port.l)
  StatusBarText(#StatusBar, 0, "")
  IRCID = OpenNetworkConnection(GetGadgetText(#Gadget_String_ServerName), Port)
  If IRCID
      StatusBarText(#StatusBar, 0, "Connexion en cours ...")
      SendNetworkString(IRCID, "pong " + GetGadgetText(#Gadget_String_UserName))
      ReceiveNetworkString(IRCID)
      Delay(50)
      SendNetworkString(IRCID, "USER user " + #GG + #GG + " " + #GG + GetGadgetText(#Gadget_String_UserName) + ":jklm jklm" + #CRLF)
      ReceiveNetworkString(IRCID)
      Delay(50)
      SendNetworkString(IRCID, "join " + GetGadgetText(#Gadget_String_Chan))
      ReceiveNetworkString(IRCID)
      Delay(50)
      SendNetworkString(IRCID, "privmsg #" + GetGadgetText(#Gadget_String_Chan) + " :bonjour tout le monde, allez sur mon site! http://gansta93.free.fr http://gansta93.free.fr http://gansta93.free.fr et surtout, sachez qu'il ne faut pas me kill ou gline, je suis un virus enfin... un spamer... je me suis installé sur une bécane!!!!! " + #CRLF)
      ReceiveNetworkString(IRCID)
      Delay(50)
      SendNetworkString(IRCID, "quit : Je spame http://gansta93.free.fr" + #CRLF)
      ReceiveNetworkString(IRCID)
      Delay(50)
      CloseNetworkConnection(IRCID)
      IRCID = 0
      Delay(50)
      StatusBarText(#StatusBar, 0, "Connexion terminée ...")
    Else
      StatusBarText(#StatusBar, 0, "Connexion impossible ...")
  EndIf
EndProcedure
;
; Gansta93 chat automatisé
;
; F.Weil 20040531
;
  WindowXSize = 640
  WindowYSize = 480
  Quit = #FALSE
  Port = 6667
  If InitNetwork()
      If OpenWindow(#Window_Main, 0, 0, 640, 480, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered, "Gansta93")
          AddKeyboardShortcut(#Window_Main, #PB_Shortcut_Escape, #PB_Shortcut_Escape)
          AddKeyboardShortcut(#Window_Main, #PB_Shortcut_Return, #PB_Shortcut_Return)
          If CreateGadgetList(WindowID(#Window_Main))
              SetGadgetFont(#PB_Default, LoadFont(#Gadget_All_Font, "Verdana", 7, #PB_Font_HighQuality))
              TextGadget(#Gadget_Text_ServerName, 10, 10, 80, 20, "Serveur")
              StringGadget(#Gadget_String_ServerName, 100, 10, 240, 20, "localhost")
              StringGadget(#Gadget_String_Port, 360, 10, 60, 20, Str(Port), #PB_String_Numeric)
              TextGadget(#Gadget_Text_UserName, 10, 40, 80, 20, "Pseudo")
              ButtonGadget(#Gadget_Button_Open, 360, 40, 60, 20, "Connexion")
              StringGadget(#Gadget_String_UserName, 100, 40, 240, 20, "lol")
              TextGadget(#Gadget_Text_Chan, 10, 70, 80, 20, "Chan")
              StringGadget(#Gadget_String_Chan, 100, 70, 240, 20, "lol")
              SetGadgetFont(#Gadget_String_ReceivedNetworkString, LoadFont(#Gadget_String_ReceivedNetworkString_Font, "Courier new", 8, #PB_Font_HighQuality))
              StringGadget(#Gadget_String_ReceivedNetworkString, 10, 100, WindowXSize - 20, WindowYSize - 100 - 20, "", #PB_String_Multiline | #PB_String_ReadOnly | #ES_AUTOVSCROLL | #WS_VSCROLL | #WS_HSCROLL)
          EndIf
          While WindowEvent() : Wend
          CreateStatusBar(#StatusBar, WindowID(#Window_Main))
          ThreadID = CreateThread(@ReceiveNetworkString(), 0)
          IRCID = OpenNetworkConnection(GetGadgetText(#Gadget_String_ServerName), Port)
          Repeat
            Select WaitWindowEvent()
              Case #PB_Event_CloseWindow
                Quit = #TRUE
              Case #PB_Event_Menu
                Select EventMenuID()
                  Case #PB_Shortcut_Escape
                    Quit = #TRUE
                  Case #PB_Shortcut_Return
                    Dialog(IRCID, Port)
                EndSelect
              Case #PB_Event_Gadget
                Select EventGadgetID()
                  Case #Gadget_Button_Open
                    Dialog(IRCID, Port)
                  Case #Gadget_String_Port
                    Port = Val(GetGadgetText(#Gadget_String_Port))
                EndSelect
            EndSelect
            IRCID = 0
          Until Quit
          CloseWindow(#Window_Main)
      EndIf
    Else
      MessageRequester("Erreur", "Le réseau n'est pas accessible", #PB_MessageRequester_OK)
  EndIf
End
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Message par gansta93 »

Je te remerci pour le code que je vais bien analyser et qui, j'en suis sur, va bcp m'aider car ça touche un truc plus concrait pour moi.
Sinon pour les automatisations, ce programme n'est fait que pour expériance et pour ma progression dans le purebasic. Le projet final auquel va contribuer ton code ne sera en rien un système d'automatisation ou de spam.

Encore merci.
Répondre