OVH Cloud OVH Cloud

Partager des sockets entre des threads

3 réponses
Avatar
Bacto
Bonjour,

J'ai un programme qui écoute sur port via IO::Socket.
Lorsqu'un nouveau client arrive, il lance un thread dans lequel il communique
avec le client.

Mon problème est le suivant. J'ai deux clients qui se connectent. Un client A
et un client B. Deux threads (A et B) sont donc crées.

J'ai un hash qui est partagé entre les threads qui contient la liste
des clients.
Dedans, j'aimerai stocker le handle retourné par
$server->accept().
Afin que le client B puisse envoyer des datas au
client A via $hash{"clientA"}{"socket"}.
Or ça ne marche pas...
Lorsque que dans le thread je copie le socket dans mon tableau de hash,
j'ai l'erreur :
thread failed to start: Invalid value for shared scalar at
./main.pl line 175, <GEN2> line 12.

Ce n'est pas faute d'avoir cherché, mais je ne trouve pas de solution :-/
Si quelqu'un pouvait m'eclairer...

Adrien

3 réponses

Avatar
Scetbon Cyril
Tu peux utiliser une file :

perldoc Thread::Queue

Ton thread B ecrit dans la file et le thread A lit le message passe pour
l'envoyer dans sa socket.

Bonjour,

J'ai un programme qui écoute sur port via IO::Socket.
Lorsqu'un nouveau client arrive, il lance un thread dans lequel il communique
avec le client.

Mon problème est le suivant. J'ai deux clients qui se connectent. Un client A
et un client B. Deux threads (A et B) sont donc crées.

J'ai un hash qui est partagé entre les threads qui contient la liste
des clients.
Dedans, j'aimerai stocker le handle retourné par
$server->accept().
Afin que le client B puisse envoyer des datas au
client A via $hash{"clientA"}{"socket"}.
Or ça ne marche pas...
Lorsque que dans le thread je copie le socket dans mon tableau de hash,
j'ai l'erreur :
thread failed to start: Invalid value for shared scalar at
./main.pl line 175, <GEN2> line 12.

Ce n'est pas faute d'avoir cherché, mais je ne trouve pas de solution :-/
Si quelqu'un pouvait m'eclairer...

Adrien



Avatar
Bacto
Tu peux utiliser une file :

perldoc Thread::Queue

Ton thread B ecrit dans la file et le thread A lit le message passe pour
l'envoyer dans sa socket.


Merci pour ta réponse :) Je commençai à desesperer !
Le problème (ou alors j'ai raté quelque chose ?), c'est qu'en passant
par une queue, je bloque mon thread A pour qu'il puisse le lire, je ne
me trompe pas ?

Cordialement,
Adrien

Bonjour,

J'ai un programme qui écoute sur port via IO::Socket.
Lorsqu'un nouveau client arrive, il lance un thread dans lequel il
communique avec le client.

Mon problème est le suivant. J'ai deux clients qui se connectent. Un
client A et un client B. Deux threads (A et B) sont donc crées.

J'ai un hash qui est partagé entre les threads qui contient la liste
des clients.
Dedans, j'aimerai stocker le handle retourné par $server->accept().
Afin que le client B puisse envoyer des datas au client A via
$hash{"clientA"}{"socket"}.
Or ça ne marche pas...
Lorsque que dans le thread je copie le socket dans mon tableau de hash,
j'ai l'erreur :
thread failed to start: Invalid value for shared scalar at ./main.pl
line 175, <GEN2> line 12.

Ce n'est pas faute d'avoir cherché, mais je ne trouve pas de solution :-/
Si quelqu'un pouvait m'eclairer...

Adrien





Avatar
Scetbon Cyril
exact !!!
Rien ne t'empeches d'utiliser une variable partagee pour signaler qu'un
message a ete place dans la file.

Tu peux utiliser une file :

perldoc Thread::Queue

Ton thread B ecrit dans la file et le thread A lit le message passe
pour l'envoyer dans sa socket.


Merci pour ta réponse :) Je commençai à desesperer !
Le problème (ou alors j'ai raté quelque chose ?), c'est qu'en passant
par une queue, je bloque mon thread A pour qu'il puisse le lire, je ne
me trompe pas ?

Cordialement,
Adrien

Bonjour,

J'ai un programme qui écoute sur port via IO::Socket.
Lorsqu'un nouveau client arrive, il lance un thread dans lequel il
communique avec le client.

Mon problème est le suivant. J'ai deux clients qui se connectent. Un
client A et un client B. Deux threads (A et B) sont donc crées.

J'ai un hash qui est partagé entre les threads qui contient la liste
des clients.
Dedans, j'aimerai stocker le handle retourné par $server->accept().
Afin que le client B puisse envoyer des datas au client A via
$hash{"clientA"}{"socket"}.
Or ça ne marche pas...
Lorsque que dans le thread je copie le socket dans mon tableau de hash,
j'ai l'erreur :
thread failed to start: Invalid value for shared scalar at ./main.pl
line 175, <GEN2> line 12.

Ce n'est pas faute d'avoir cherché, mais je ne trouve pas de
solution :-/
Si quelqu'un pouvait m'eclairer...

Adrien