cs_manFIRE
Messages postés13Date d'inscriptionmercredi 25 décembre 2002StatutMembreDernière intervention26 avril 2004
-
17 avril 2004 à 19:19
Om3g4_666
Messages postés2Date d'inscriptionjeudi 4 novembre 2004StatutMembreDernière intervention 3 décembre 2004
-
3 déc. 2004 à 00:50
Salut a tous
J'ai créer un client mirc qui se connect très bien .
Client.SendData datasend 'en envoie un PONG au PING
End If
mais le problème est, si mon client fait une autre fonction comme afficher espace du disque dur ou le uptime de la machine pendant que le server envoie un ping, il fait un pingtimeout
aimerais savoir si il y a une manière de toujours faire 2 fonction en même temps . Ou de donné priorité a la réponse du Ping du server .
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 17 avril 2004 à 20:20
Salut manFIRE
On a passé 30 minutes à en parler sur le chan et tu n'as tjrs pas compris ?
Quand tu reçois des données, tu les stockes dans datasend
Ensuite, tu testes si le début est un PING et si c'est le cas, tu réponds PONG accompagnés de la fin des données reçues.
Classique.
Mais voilà, je t'ai dit que tu pouvais, dans la même instance de ton DataArrival, recevoir plusieurs messages successif du client :
Ca dépend du taux de charge de la machine. En fait, tu charges le buffer du controle. Si le controle n'a pas eu le temps de dire à ton programme qu'il y a de nouvelles données, il accumule les messages dans ce buffer.
Donc, quand tu reçois "PING GnaGna", en réalité, tu reçois peut-être "PING GnaGnaPING GnaGnaPING GnaGna"
-1- Tu n'auras répondu qu'une fois au lieu de 3
-2- Ta réponse sera "PONG GnaGnaPING GnaGnaPING GnaGna", ce qui ne sera pas correct.
Ce qu'il faut, c'est :
-1- isoler plus proprement le texte que de réponse qui suivra le PONG (tu en connais peut-être la longueur)
-2- Répondre avec ces données
-3- Supprimer le "PING GnaGna" que tu viens de traiter du début de la chaine datasend
-4- Si datasend n'est pas vide, il faut reboucler au dessus pour refaire un test du type de message ...
J'espère que ce sera plus clair lu d'une traite et sans perturbation !
cs_liquide
Messages postés1016Date d'inscriptionsamedi 22 mars 2003StatutMembreDernière intervention24 juin 2008 18 avril 2004 à 00:05
salut
je suis peut etre, voire sans doute hors de propos mais de ce que j'ai compris, quand tu fais une manip, le pc prend les commande et met ton ping en attente. c'est etonnant car en principe les données meme si ralentis, sont envoyées rapidement, alors je me demande si tu n'a pas un doevents qqe part.
Pour completer ce qu'a dit Jack et si je ne me trompe pas, quand les données sont dans le buffer, meme si elles sont en "paquets", comme tes données sont envoyées une a une, mais toi tu les as ensemble, il existe en principe toujours une "commande" de fin de "paquet" comme un vbtab ou un vbcrlf.
peut etre qu'un while wend pourrait te convenir ou meme un split si tu connais le nombre exact du tableau
si je me plante ne m'en veuillez pas je ne connais pas mirc mais je me pose la question si il n'y a pas un code préalable au ping qu'il faut extraire.
cs_liquide
Messages postés1016Date d'inscriptionsamedi 22 mars 2003StatutMembreDernière intervention24 juin 2008 26 avril 2004 à 11:03
Quand tu captures les données recus, par un soft appproprié, tu recois quoi exactement? Donne plusieurs exemples de paquets recus quand tu as ton PING ainsi que le code qu'il y a entre chaque paquet.
et puis par rapport a ce que je connais, je me demande si le select case n'est pas plus approprié.
StgDeChaquePaquet = extraction de la chaine voulu
select case StgDeChaquePaquet
case "PING"
Client.SendData "PONG nomdemonserver" & Chr$(10)
case "AutreChose1"
Client.SendData "AutreChose11" & Chr$(10)
case "autreChose2"
Client.SendData "AutreChose21" & Chr$(10)
case else
end select
bonne prog
liquide
Vous n’avez pas trouvé la réponse que vous recherchez ?
Om3g4_666
Messages postés2Date d'inscriptionjeudi 4 novembre 2004StatutMembreDernière intervention 3 décembre 2004 3 déc. 2004 à 00:50
Salut man fire
tu te souvient de moi ? hehe eh oui je code vb maintenant
je croit que tu n utilise plus ton ancienne email
tu peu me rajouter sur ton msn
Om3g4_666@hotmail.com
pour la reponse a ton problem, comme jack disait il suffit de d isoler ton code comme il faut, voici un bout de mon code
Private Sub WinSuck_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim Data As String 'The Data
Dim ptr As Integer 'Pointer To The Next Vbcrlf
Dim oldptr As Integer 'Old Pointer
Dim Line As String 'Each Line In Data
ptr = 1
If bytesTotal <> 0 Then 'If Have Data or if data != null
UnderSock(Index).GetData Data, vbString 'Get The Shit
End If 'For Each Line...
While InStr(ptr, Data, vbCrLf) > 1
oldptr = ptr
ptr = InStr(ptr, Data, vbCrLf) + Len(vbCrLf)
Line = Mid(Data, oldptr, ptr - oldptr - Len(vbCrLf))
PrintDBG Line
If Left(Line, 4) = "PING" Then
SendData Index, "PONG " & Mid(Line, InStr(1, Line, ":") + 1)
Else: EventEngine Index, Line
End If
Wend
End Sub
Private Sub EventEngine(Index As Integer, Line As String)
If Connected(Index) <> "1" Then 'If Not Connected
Select Case Matching(Line, "2")
Case "AUTH" 'Authentification To The Server
SendData Index, "USER " & Ident
SendData Index, "NICK " & Nick
Case "433" 'Fuck Nick Used, No Problemo :D
SendData Index, "NICK " & NickFlag & "-" & Rnd(100)
Case "376" 'Yeah Connected !! :)
Connected(Index) = "1"
Join Index, Chan
End Select
Else 'Else If Already Connected
Select Case Matching(Line, "2")
Case "PRIVMSG" 'Ohh Private Msg, Check If Its A Owner
For x = LBound(Owner()) To UBound(Owner()) If Mid(Matching(Line, "1"), InStr(1, Line, "!") + 1, Len(Owner(x).Hostmask)) Owner(x).Hostmask And Mid(Matching(Line, "1"), 2, Len(Owner(x).Nick)) Owner(x).Nick Then
If Mid(Matching(Line, "4"), 1, 2) = ":." Then
CMD = Mid(Matching(Line, "4-"), 3) 'If Its A Owner, Check If Its A Command
Command Index, Mid(CMD, 1, Len(CMD)), Owner(x).Admin
End If
Exit For
End If
Next x
End Select
End If
End Sub
si la function InStr et Mid t étourdi j ai une function pour toi
Public Function Matching(ByRef Data, ByRef n, Optional ByRef Match As String = " ")
Dim Str() As String
Dim Result As String
Str() = Split(Data, Match)
If Right(n, 1) = "-" Then
n = Left(n, 1) - 1
For x = n To UBound(Str())
Result = Result & Str(x) & " "
Next x
Else
If UBound(Str()) >= n - 1 Then
Result = Str(n - 1)
End If
End If
Matching = Result
End Function
Matching("allo manFIRE sa va ?",2) = "manFIRE"
Matching("allo manFIRE sa va ?",3-) = "sa va ?"
l optional Match argument sert si tu veu separer tes token par autre que l espace, un crlf par exemple
ps rajoute moi sur ton msn faut qu on se reparle ;)
Om3g4_666
Messages postés2Date d'inscriptionjeudi 4 novembre 2004StatutMembreDernière intervention 3 décembre 2004 3 déc. 2004 à 00:50
Salut man fire
tu te souvient de moi ? hehe eh oui je code vb maintenant
je croit que tu n utilise plus ton ancienne email
tu peu me rajouter sur ton msn
Om3g4_666@hotmail.com
pour la reponse a ton problem, comme jack disait il suffit de d isoler ton code comme il faut, voici un bout de mon code
Private Sub WinSuck_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim Data As String 'The Data
Dim ptr As Integer 'Pointer To The Next Vbcrlf
Dim oldptr As Integer 'Old Pointer
Dim Line As String 'Each Line In Data
ptr = 1
If bytesTotal <> 0 Then 'If Have Data or if data != null
UnderSock(Index).GetData Data, vbString 'Get The Shit
End If 'For Each Line...
While InStr(ptr, Data, vbCrLf) > 1
oldptr = ptr
ptr = InStr(ptr, Data, vbCrLf) + Len(vbCrLf)
Line = Mid(Data, oldptr, ptr - oldptr - Len(vbCrLf))
PrintDBG Line
If Left(Line, 4) = "PING" Then
SendData Index, "PONG " & Mid(Line, InStr(1, Line, ":") + 1)
Else: EventEngine Index, Line
End If
Wend
End Sub
Private Sub EventEngine(Index As Integer, Line As String)
If Connected(Index) <> "1" Then 'If Not Connected
Select Case Matching(Line, "2")
Case "AUTH" 'Authentification To The Server
SendData Index, "USER " & Ident
SendData Index, "NICK " & Nick
Case "433" 'Fuck Nick Used, No Problemo :D
SendData Index, "NICK " & NickFlag & "-" & Rnd(100)
Case "376" 'Yeah Connected !! :)
Connected(Index) = "1"
Join Index, Chan
End Select
Else 'Else If Already Connected
Select Case Matching(Line, "2")
Case "PRIVMSG" 'Ohh Private Msg, Check If Its A Owner
For x = LBound(Owner()) To UBound(Owner()) If Mid(Matching(Line, "1"), InStr(1, Line, "!") + 1, Len(Owner(x).Hostmask)) Owner(x).Hostmask And Mid(Matching(Line, "1"), 2, Len(Owner(x).Nick)) Owner(x).Nick Then
If Mid(Matching(Line, "4"), 1, 2) = ":." Then
CMD = Mid(Matching(Line, "4-"), 3) 'If Its A Owner, Check If Its A Command
Command Index, Mid(CMD, 1, Len(CMD)), Owner(x).Admin
End If
Exit For
End If
Next x
End Select
End If
End Sub
si la function InStr et Mid t étourdi j ai une function pour toi
Public Function Matching(ByRef Data, ByRef n, Optional ByRef Match As String = " ")
Dim Str() As String
Dim Result As String
Str() = Split(Data, Match)
If Right(n, 1) = "-" Then
n = Left(n, 1) - 1
For x = n To UBound(Str())
Result = Result & Str(x) & " "
Next x
Else
If UBound(Str()) >= n - 1 Then
Result = Str(n - 1)
End If
End If
Matching = Result
End Function
Matching("allo manFIRE sa va ?",2) = "manFIRE"
Matching("allo manFIRE sa va ?",3-) = "sa va ?"
l optional Match argument sert si tu veu separer tes token par autre que l espace, un crlf par exemple
ps rajoute moi sur ton msn faut qu on se reparle ;)