Problème avec mon ami Winsock !!!

cs_manFIRE Messages postés 13 Date d'inscription mercredi 25 décembre 2002 Statut Membre Dernière intervention 26 avril 2004 - 17 avril 2004 à 19:19
Om3g4_666 Messages postés 2 Date d'inscription jeudi 4 novembre 2004 Statut Membre Derniè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 .

il répond au PONG du server

If Left(receive, 4) = "PING" Then

receive = Left(receive, Len(receive) - 2)

datasend = "PONG" & Right(receive, Len(receive) - 4) & Chr(10)

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 .

Merci d'avance
8-)

6 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
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 !

Vala
Jack
0
cs_liquide Messages postés 1016 Date d'inscription samedi 22 mars 2003 Statut Membre Dernière intervention 24 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.

bonne prog
liquide
0
cs_manFIRE Messages postés 13 Date d'inscription mercredi 25 décembre 2002 Statut Membre Dernière intervention 26 avril 2004
26 avril 2004 à 02:19
Client.GetData receive, vbString 'Créer un Receive sockeT

'si il a un erreur on va en bas
On Error GoTo erreur

If receive Like "*PING*" Then


Client.SendData "PONG nomdemonserver" & Chr$(10)

End If

cé quoi tu en pense ?
0
cs_liquide Messages postés 1016 Date d'inscription samedi 22 mars 2003 Statut Membre Dernière intervention 24 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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Om3g4_666 Messages postés 2 Date d'inscription jeudi 4 novembre 2004 Statut Membre Derniè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 ;)
0
Om3g4_666 Messages postés 2 Date d'inscription jeudi 4 novembre 2004 Statut Membre Derniè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 ;)
0
Rejoignez-nous