[Résolu] Plusieurs instances serveur

Vous avez une idée pour améliorer ou modifier PureBasic ? N'hésitez pas à la proposer.
LeCyb
Messages : 273
Inscription : dim. 26/déc./2004 20:49

[Résolu] Plusieurs instances serveur

Message par LeCyb »

Cela me serait grandement utile de pouvoir lancer plusieurs instances de serveur réseau.
Peut-être en utilisant un paramètre dans la fonction NetworkServerEvent (du même genre que NetworkClientEvent) cela devriendrait possible.
En tout cas moi je suis fort bloqué par cette limitation.
Dernière modification par LeCyb le dim. 04/sept./2005 21:51, modifié 1 fois.
Vive le thread-safe !
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

Syntaxe

ClientID = NetworkClientID()
Description

Cette fonction n'est nécessaire que sur le serveur. Elle permet de savoir quel client a envoyé des données.
bonjour, n'est-ce pas de ca dont tu a besoin ?
Image
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

il parle du serveur, pouvoir en créer plusieurs avec le même exe... tout comme on peut avoir plusieurs clients...

Dri
LeCyb
Messages : 273
Inscription : dim. 26/déc./2004 20:49

Message par LeCyb »

J'aimerais bien pouvoir ouvrir plusieurs ports dans le même programme.

Du genre:

Code : Tout sélectionner

InitNetwork()
S1 = CreateNetworkServer(9999)
S2 = CreateNetworkServer(8888)

SEvent1 = NetworkServerEvent(S1)
SEvent2 = NetworkServerEvent(S2)

CloseNetworkServer(S1)
CloseNetworkServer(S2)
Le soucis c'est que les fonctions NetworkServerEvent et CloseNetworkServer ne supportent pas ces paramètres.
Vive le thread-safe !
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Message par gansta93 »

Et si tu appelles plusieur fois CreateNetworkServer(), puis qu'à chaque évènement tu prands par l'API de quel port vien le client ?
LeCyb
Messages : 273
Inscription : dim. 26/déc./2004 20:49

Message par LeCyb »

Si je fais plusieurs CreateNetworkServer ça ouvre bien les ports mais comment les fermer ?

Tu as une idée de quelles fonctions utiliser de l'API ?
Vive le thread-safe !
Heis Spiter
Messages : 1092
Inscription : mer. 28/janv./2004 16:22
Localisation : 76
Contact :

Message par Heis Spiter »

J'appuie cette demande aussi.
J'en aurais besoin :oops:
Heis Spiter, webmaster du site http://www.heisspiter.net
Développeur principal et administrateur du projet Bird Chat
Parti courir au bonheur du dév. public et GPL :D
LeCyb
Messages : 273
Inscription : dim. 26/déc./2004 20:49

Message par LeCyb »

Après plusieurs recherches j'ai réussi à récupérer l'ip et le port distant et local ce qui peut arranger notre histoire.
Pour fermer la connexion j'ai simplement utilisé CloseNetworkConnextion :D.

Voici une petite librairie, mais attention les adresses IP sont au format Long Big Endian non-signés (càd DDCCBBAA si l'ip est AA.BB.CC.DD).

Code : Tout sélectionner

Structure ws_sockaddr
  Family.w
  Port.w
  IPLong.l
  zeros.l[8]
EndStructure

; Renvoit l'adresse IP distante de la connexion au format Long.
; Renvoit Zéro si la procédure a échouée
; THREAD SAFE
; Cnx [in] = connexion
ProcedureDLL.l RemoteIP(Cnx.l) ; Récupère l'adresse IP distante de la connexion
  Protected length.l, IP.ws_sockaddr, res.l
  length = SizeOf(IP)
  res = getpeername_(Cnx, @IP, @length)
  If res = 0
    ProcedureReturn IP\IPLong
  Else
    ProcedureReturn 0
  EndIf
EndProcedure

; Renvoit le Port distant de la connexion
; Renvoit Zéro si la procédure a échouée
; THREAD SAFE
; Cnx [in] = connexion
ProcedureDLL.l RemotePort(Cnx.l) ; Récupère le port distant de la connexion
  Protected length.l, IP.ws_sockaddr, res.l
  length = SizeOf(IP)
  res = getpeername_(Cnx, @IP, @length)
  If res = 0
    ProcedureReturn IP\Port & $FFFF
  Else
    ProcedureReturn 0
  EndIf
EndProcedure

; Renvoit l'adresse IP locale de la connexion au format Long
; Renvoit Zéro si la procédure a échouée
; THREAD SAFE
; Cnx [in] = connexion
ProcedureDLL.l LocalIP(Cnx.l) ; Récupère l'adresse IP local de la connexion
  Protected length.l, IP.ws_sockaddr, res.l
  length = SizeOf(IP)
  res = getsockname_(Cnx, @IP, @length)
  If res = 0
    ProcedureReturn IP\IPLong
  Else
    ProcedureReturn 0
  EndIf
EndProcedure


; Renvoit le Port local de la connexion
; Renvoit Zéro si la procédure a échouée
; THREAD SAFE
; Cnx [in] = connexion
ProcedureDLL.l LocalPort(Cnx.l) ; Récupère le port local de la connexion
  Protected length.l, IP.ws_sockaddr, res.l
  length = SizeOf(IP)
  res = getsockname_(Cnx, @IP, @length)
  If res = 0
    ProcedureReturn IP\Port & $FFFF
  Else
    ProcedureReturn 0
  EndIf
EndProcedure
Dernière modification par LeCyb le lun. 05/sept./2005 9:11, modifié 1 fois.
Vive le thread-safe !
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Code : Tout sélectionner

  res = ...
  If result = 0
result sera toujours égal à 0 dans tes fonctions... Sinon le format de l'ip c'est comme le format RGBA ^^
tout ce qu'il y a de plus habituel sous windows.

Dri ;)
LeCyb
Messages : 273
Inscription : dim. 26/déc./2004 20:49

Message par LeCyb »

Bien vu j'ai modifié la petite faute :)
Vive le thread-safe !
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

tu es sûr que si res = 0 alors la fonction n'a pas rencontré d'erreur ? (juste vérifie ^^)

Dri
LeCyb
Messages : 273
Inscription : dim. 26/déc./2004 20:49

Message par LeCyb »

Vivi c'est marqué dans le msdn.
Maintenant si chez krosoft ils écrivent des conneries là je peux rien faire :D
Vive le thread-safe !
Répondre