Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Pb propriété RemoteHostIP de Winsock

7 réponses
Avatar
ns
Bonjour,

Avec le control Winsock, je fais écouter un serveur sur un port en UDP (mode
non connecté).

Je reçois une bonne quantité de flux provenant de plusieurs machines.
Exemple :
Réception "AAA" de la machine "192.168.0.1"
Réception "BBB" de la machine "192.168.0.2"
Réception "CCC" de la machine "192.168.0.3"

Parfois, je reçois du flux d'une machine donnée pendant que la propriété
"RemoteHostIP" du control Winsock me renvoie l'adresse d'une autre machine.
Comme ceci dans l'exemple :

Réception "AAA" de la machine "192.168.0.2"
Pourtant c'est "192.168.0.1" qui a envoyée "AAA" et c'est certain.

J'ai sans doute oublier quelque chose dans le paramètrage de Winsock en UDP!

Une partie de mon code ci-dessous. Le reste du code n'a aucun lien avec mon
control Winsock.

Merci infiniment pour votre aide précieuse
NS


Private Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim strData As String
Dim strRemoteHost As String

strRemoteHost = Winsock1(Index).RemoteHostIP

Debug.Print strRemoteHost

Winsock1(Index).GetData strData, vbString
Debug.Print "Réception " & strData & " de la machine " & strRemoteHost

End Sub

7 réponses

Avatar
ng
Salut,

Je vois que tu as un groupe de controle, tu as plusieurs winsock qui
ecoutent ?

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
Avatar
Thierry Bertrand
Ton code me semble correct à priori. Je dois dire que j'en ai écrit du
semblable, mais je n'ai pas testé en charge importante.

Tu as plusieurs occurence de contrôle winsock car je suppose que tu es en
écoute de plusieurs machines, et donc quand une demande de connexion arrive,
tu fais un load winsock1(nbWinsock).

La question que je me pose est la suivante:
L'indexation d'un objet sous VB6 est-elle VRAIMENT la création d'un nouvel
objet, ou bien n'y a-t-il pas le risque d'un "certain mélange" ?
Au quel cas, quand tu es en train de charger les datas, il se pourrait que
si un autre échange arrive, alors les informations fournies par le contrôle
se mélangent. Pour que cela ne se mélange pas, il faudrait qu'une deuxième
occurence de la sub winsock1_dataarrival soit instanciée, et ça m'étonnerait
que ce soit VRAIEMNT le cas.

D'ailleurs en .NET, les contrôles indexé ne sont pas supportés, sauf à
écrire soit même la mécanique ... Donc ce n'est pas si transparent.

Pour en être sûr, et si tu a le temps et que c'est possible, au lieu
d'utiliser des winsocks indéxé, ne pourrais-tu pas utiliser des winsocks
différents (winsock1, winsock2, etc...) sur des ports différents
car dans ce cas, on est certain que les objets sont différents, et les sub
associées aussi.

personnellement, c'est le test que je ferai. Sauf que les conditions ne sont
peut être pas faciles à remplir.
Ci dessous un morceau de code pour gérer un serveur à l'écoute sur TCP ou
UDP au choix, que j'ai écrit il y a bien longtemps. Je pense que tu y
retrouveras la même mécanique que la tienne. Donc ton idée est à priori
juste, mais encore une fois, je n'ai pas testé en environnement VRAIMENT
agressif, c'est à dire des connexions qui arrivent en rafale.


Private Sub mnuServerStart_Click()
If frmSetting.Protocol = TCPProtocole Then
TCPServer(0).Protocol = sckTCPProtocol
TCPServer(0).LocalPort = frmSetting.LocalPortNumber
TCPServer(0).Listen
Else
TCPServer(0).Protocol = sckUDPProtocol
TCPServer(0).LocalPort = frmSetting.LocalPortNumber
TCPServer(0).Bind TCPServer(0).LocalPort
End If
mnuServerStart.Enabled = False
mnuServerStop.Enabled = True
End Sub

Private Sub mnuServerStop_Click()
Dim I As Integer

TCPServer(0).Close
For I = TCPServerMax To 1 Step -1
Unload TCPServer(I)
Next I
mnuServerStart.Enabled = True
mnuServerStop.Enabled = False
End Sub

Private Sub TCPServer_ConnectionRequest(Index As Integer, ByVal requestID As
Long)
If Index = 0 Then
TCPServerMax = TCPServerMax + 1
Load TCPServer(TCPServerMax)
TCPServer(TCPServerMax).RemotePort = 0
TCPServer(TCPServerMax).Accept requestID
End If
End Sub

Private Sub TCPServer_DataArrival(Index As Integer, ByVal bytesTotal As
Long)
Dim strData As String
Dim I As Long
Dim From As String
Dim OneMesure As String
Dim J As Long

TCPServer(Index).GetData strData
From = TCPServer(Index).RemoteHostIP
J = InStr(strData, "!")
While J > 0
OneMesure = Left(strData, J - 1)
I = InStr(OneMesure, "|") - 1
SaveRemoteInfo Left(OneMesure, I) & " from " & From, Mid(OneMesure,
I + 2, 8), Mid(OneMesure, I + 10, 4), CByte(Right(OneMesure,
Len(OneMesure) - I - 13))
strData = Right(strData, Len(strData) - J)
J = InStr(strData, "!")
Wend
End Sub
Avatar
Ouattara Inssoukira
Salut
Je crois que cela est normal, tel que le programme est écrit. En effet les
arrivées des data sur les winsock ne peuvent pas être synchronisées parceque
tu ne peux pas les prévoir.

Essaies ceci :
Crées plutot deux objets winsock : winsock1 et winsock2
Mets à zéro l'index de winsock2

Ton programme doit avoir un seul objet winsock pour écouter sur le port
(winsock1)..
Quand il y une demande de connexion (ConnectionRequest), tu dois l'accepter
sur un des winsock indexés winsock2..

exemple :

Ecoute du port sur winsock1 :

sub form_load
winsock1.localport = numero de port
winsock1.listen
end sub

Acceptation de la connexion sur winsock2, créé dynamiquement par le
programme :

Private Sub Winsock1_ConnectionRequest( ByVal requestID As Long)
Dim ws As Winsock
Set ws = Winsock2(Winsock2.UBound + 1)
Load ws
ws.Accept requestID
End Sub

Private Sub Winsock2_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Winsock2(Index).GetData donrec, vbString
...
.....
End Sub

Tu pourras optimiser reprenant les objets winsock2 libérés suite à un close

"ns" a écrit dans le message de
news:
Bonjour,

Avec le control Winsock, je fais écouter un serveur sur un port en UDP


(mode
non connecté).

Je reçois une bonne quantité de flux provenant de plusieurs machines.
Exemple :
Réception "AAA" de la machine "192.168.0.1"
Réception "BBB" de la machine "192.168.0.2"
Réception "CCC" de la machine "192.168.0.3"

Parfois, je reçois du flux d'une machine donnée pendant que la propriété
"RemoteHostIP" du control Winsock me renvoie l'adresse d'une autre


machine.
Comme ceci dans l'exemple :

Réception "AAA" de la machine "192.168.0.2"
Pourtant c'est "192.168.0.1" qui a envoyée "AAA" et c'est certain.

J'ai sans doute oublier quelque chose dans le paramètrage de Winsock en


UDP!

Une partie de mon code ci-dessous. Le reste du code n'a aucun lien avec


mon
control Winsock.

Merci infiniment pour votre aide précieuse
NS


Private Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As


Long)
Dim strData As String
Dim strRemoteHost As String

strRemoteHost = Winsock1(Index).RemoteHostIP

Debug.Print strRemoteHost

Winsock1(Index).GetData strData, vbString
Debug.Print "Réception " & strData & " de la machine " & strRemoteHost

End Sub




Avatar
ns
OUI. avec un index.

"ng" a écrit dans le message de
news:OmsNIJ%
Salut,

Je vois que tu as un groupe de controle, tu as plusieurs winsock qui
ecoutent ?

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/


Avatar
ns
Merci Thierry pour ton aide. L'idée de créer plusieurs objets Winsocks est
bonne pour voir le comportement.
je testerai et je ferai un retour.

Je vais voir aussi ton code au cas ou.

Merci
NS


"Thierry Bertrand" <bertrand.thierry(nospam)@(nospam)numericable.fr> a écrit
dans le message de news:uo5UI9$
Ton code me semble correct à priori. Je dois dire que j'en ai écrit du
semblable, mais je n'ai pas testé en charge importante.

Tu as plusieurs occurence de contrôle winsock car je suppose que tu es en
écoute de plusieurs machines, et donc quand une demande de connexion


arrive,
tu fais un load winsock1(nbWinsock).

La question que je me pose est la suivante:
L'indexation d'un objet sous VB6 est-elle VRAIMENT la création d'un nouvel
objet, ou bien n'y a-t-il pas le risque d'un "certain mélange" ?
Au quel cas, quand tu es en train de charger les datas, il se pourrait que
si un autre échange arrive, alors les informations fournies par le


contrôle
se mélangent. Pour que cela ne se mélange pas, il faudrait qu'une deuxième
occurence de la sub winsock1_dataarrival soit instanciée, et ça


m'étonnerait
que ce soit VRAIEMNT le cas.

D'ailleurs en .NET, les contrôles indexé ne sont pas supportés, sauf à
écrire soit même la mécanique ... Donc ce n'est pas si transparent.

Pour en être sûr, et si tu a le temps et que c'est possible, au lieu
d'utiliser des winsocks indéxé, ne pourrais-tu pas utiliser des winsocks
différents (winsock1, winsock2, etc...) sur des ports différents
car dans ce cas, on est certain que les objets sont différents, et les sub
associées aussi.

personnellement, c'est le test que je ferai. Sauf que les conditions ne


sont
peut être pas faciles à remplir.
Ci dessous un morceau de code pour gérer un serveur à l'écoute sur TCP ou
UDP au choix, que j'ai écrit il y a bien longtemps. Je pense que tu y
retrouveras la même mécanique que la tienne. Donc ton idée est à priori
juste, mais encore une fois, je n'ai pas testé en environnement VRAIMENT
agressif, c'est à dire des connexions qui arrivent en rafale.


Private Sub mnuServerStart_Click()
If frmSetting.Protocol = TCPProtocole Then
TCPServer(0).Protocol = sckTCPProtocol
TCPServer(0).LocalPort = frmSetting.LocalPortNumber
TCPServer(0).Listen
Else
TCPServer(0).Protocol = sckUDPProtocol
TCPServer(0).LocalPort = frmSetting.LocalPortNumber
TCPServer(0).Bind TCPServer(0).LocalPort
End If
mnuServerStart.Enabled = False
mnuServerStop.Enabled = True
End Sub

Private Sub mnuServerStop_Click()
Dim I As Integer

TCPServer(0).Close
For I = TCPServerMax To 1 Step -1
Unload TCPServer(I)
Next I
mnuServerStart.Enabled = True
mnuServerStop.Enabled = False
End Sub

Private Sub TCPServer_ConnectionRequest(Index As Integer, ByVal requestID


As
Long)
If Index = 0 Then
TCPServerMax = TCPServerMax + 1
Load TCPServer(TCPServerMax)
TCPServer(TCPServerMax).RemotePort = 0
TCPServer(TCPServerMax).Accept requestID
End If
End Sub

Private Sub TCPServer_DataArrival(Index As Integer, ByVal bytesTotal As
Long)
Dim strData As String
Dim I As Long
Dim From As String
Dim OneMesure As String
Dim J As Long

TCPServer(Index).GetData strData
From = TCPServer(Index).RemoteHostIP
J = InStr(strData, "!")
While J > 0
OneMesure = Left(strData, J - 1)
I = InStr(OneMesure, "|") - 1
SaveRemoteInfo Left(OneMesure, I) & " from " & From,


Mid(OneMesure,
I + 2, 8), Mid(OneMesure, I + 10, 4), CByte(Right(OneMesure,
Len(OneMesure) - I - 13))
strData = Right(strData, Len(strData) - J)
J = InStr(strData, "!")
Wend
End Sub





Avatar
ns
Merci Ouattara pour tno aide.

Je voie ce que tu peux dire mais a mon avis ceci est valable uniquement pour
les connexions TCP !!
Moi j'utilise UDP (mode non connecté) et donc pas de session ouverte et donc
pas de négociation de session... je veux dire par la que événement
"ConnectionRequest" ne exécute pas pour les connexions UDP.

Ais-je bien compris ce que tu voulais dire ?

Merci encore
NS


"Ouattara Inssoukira" a écrit dans le message de
news:%
Salut
Je crois que cela est normal, tel que le programme est écrit. En effet les
arrivées des data sur les winsock ne peuvent pas être synchronisées


parceque
tu ne peux pas les prévoir.

Essaies ceci :
Crées plutot deux objets winsock : winsock1 et winsock2
Mets à zéro l'index de winsock2

Ton programme doit avoir un seul objet winsock pour écouter sur le port
(winsock1)..
Quand il y une demande de connexion (ConnectionRequest), tu dois


l'accepter
sur un des winsock indexés winsock2..

exemple :

Ecoute du port sur winsock1 :

sub form_load
winsock1.localport = numero de port
winsock1.listen
end sub

Acceptation de la connexion sur winsock2, créé dynamiquement par le
programme :

Private Sub Winsock1_ConnectionRequest( ByVal requestID As Long)
Dim ws As Winsock
Set ws = Winsock2(Winsock2.UBound + 1)
Load ws
ws.Accept requestID
End Sub

Private Sub Winsock2_DataArrival(Index As Integer, ByVal bytesTotal As


Long)
Winsock2(Index).GetData donrec, vbString
...
.....
End Sub

Tu pourras optimiser reprenant les objets winsock2 libérés suite à un


close

"ns" a écrit dans le message de
news:
> Bonjour,
>
> Avec le control Winsock, je fais écouter un serveur sur un port en UDP
(mode
> non connecté).
>
> Je reçois une bonne quantité de flux provenant de plusieurs machines.
> Exemple :
> Réception "AAA" de la machine "192.168.0.1"
> Réception "BBB" de la machine "192.168.0.2"
> Réception "CCC" de la machine "192.168.0.3"
>
> Parfois, je reçois du flux d'une machine donnée pendant que la propriété
> "RemoteHostIP" du control Winsock me renvoie l'adresse d'une autre
machine.
> Comme ceci dans l'exemple :
>
> Réception "AAA" de la machine "192.168.0.2"
> Pourtant c'est "192.168.0.1" qui a envoyée "AAA" et c'est certain.
>
> J'ai sans doute oublier quelque chose dans le paramètrage de Winsock en
UDP!
>
> Une partie de mon code ci-dessous. Le reste du code n'a aucun lien avec
mon
> control Winsock.
>
> Merci infiniment pour votre aide précieuse
> NS
>
>
> Private Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As
Long)
> Dim strData As String
> Dim strRemoteHost As String
>
> strRemoteHost = Winsock1(Index).RemoteHostIP
>
> Debug.Print strRemoteHost
>
> Winsock1(Index).GetData strData, vbString
> Debug.Print "Réception " & strData & " de la machine " & strRemoteHost
>
> End Sub
>
>




Avatar
Ouattara Inssoukira
Ah oui. Excuses moi. Je n'ai pas fait attention au terme UDP, option sous
laquelle je n'ai jamais utilisé Winsock

A bientot

"ns" a écrit dans le message de
news:
Merci Ouattara pour tno aide.

Je voie ce que tu peux dire mais a mon avis ceci est valable uniquement


pour
les connexions TCP !!
Moi j'utilise UDP (mode non connecté) et donc pas de session ouverte et


donc
pas de négociation de session... je veux dire par la que événement
"ConnectionRequest" ne exécute pas pour les connexions UDP.

Ais-je bien compris ce que tu voulais dire ?

Merci encore
NS


"Ouattara Inssoukira" a écrit dans le message de
news:%
> Salut
> Je crois que cela est normal, tel que le programme est écrit. En effet


les
> arrivées des data sur les winsock ne peuvent pas être synchronisées
parceque
> tu ne peux pas les prévoir.
>
> Essaies ceci :
> Crées plutot deux objets winsock : winsock1 et winsock2
> Mets à zéro l'index de winsock2
>
> Ton programme doit avoir un seul objet winsock pour écouter sur le port
> (winsock1)..
> Quand il y une demande de connexion (ConnectionRequest), tu dois
l'accepter
> sur un des winsock indexés winsock2..
>
> exemple :
>
> Ecoute du port sur winsock1 :
>
> sub form_load
> winsock1.localport = numero de port
> winsock1.listen
> end sub
>
> Acceptation de la connexion sur winsock2, créé dynamiquement par le
> programme :
>
> Private Sub Winsock1_ConnectionRequest( ByVal requestID As Long)
> Dim ws As Winsock
> Set ws = Winsock2(Winsock2.UBound + 1)
> Load ws
> ws.Accept requestID
> End Sub
>
> Private Sub Winsock2_DataArrival(Index As Integer, ByVal bytesTotal As
Long)
> Winsock2(Index).GetData donrec, vbString
> ...
> .....
> End Sub
>
> Tu pourras optimiser reprenant les objets winsock2 libérés suite à un
close
>
> "ns" a écrit dans le message de
> news:
> > Bonjour,
> >
> > Avec le control Winsock, je fais écouter un serveur sur un port en UDP
> (mode
> > non connecté).
> >
> > Je reçois une bonne quantité de flux provenant de plusieurs machines.
> > Exemple :
> > Réception "AAA" de la machine "192.168.0.1"
> > Réception "BBB" de la machine "192.168.0.2"
> > Réception "CCC" de la machine "192.168.0.3"
> >
> > Parfois, je reçois du flux d'une machine donnée pendant que la


propriété
> > "RemoteHostIP" du control Winsock me renvoie l'adresse d'une autre
> machine.
> > Comme ceci dans l'exemple :
> >
> > Réception "AAA" de la machine "192.168.0.2"
> > Pourtant c'est "192.168.0.1" qui a envoyée "AAA" et c'est certain.
> >
> > J'ai sans doute oublier quelque chose dans le paramètrage de Winsock


en
> UDP!
> >
> > Une partie de mon code ci-dessous. Le reste du code n'a aucun lien


avec
> mon
> > control Winsock.
> >
> > Merci infiniment pour votre aide précieuse
> > NS
> >
> >
> > Private Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As
> Long)
> > Dim strData As String
> > Dim strRemoteHost As String
> >
> > strRemoteHost = Winsock1(Index).RemoteHostIP
> >
> > Debug.Print strRemoteHost
> >
> > Winsock1(Index).GetData strData, vbString
> > Debug.Print "Réception " & strData & " de la machine " & strRemoteHost
> >
> > End Sub
> >
> >
>
>