programmation réseau - la fonction select()
Bonjour à tous,
J'ai un petit soucis. J'utilise la fonction select() pour surveiller un descripteur de socket. En fait dans les traitements des conditions FD_ISSET, en lecture je suis en attente d'un message, en écriture je veux pouvoir envoyer des messages toutes 10 secondes (c'est du ping) avec la même socket.
Voila à quoi ressemble mon code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
#include "UDPsocket.h"
#include "NetworkBox.h"
using namespace std;
int main(int argc,char **argv)
{
UDPsocket server;
UDPsocket client;
int sdServ = server.Open(12345);
int sdClient = client.Connect("127.0.0.1",12345);
NetworkBox from;
string msg = "HELLO 23456";
//initialization of file descriptor list
fd_set fd_supervised;
fd_set fd_ping;
while(1)
{
FD_ZERO(&fd_supervised);
FD_SET(sdServ,&fd_supervised);
FD_ZERO(&fd_ping);
FD_SET(sdClient,&fd_ping);
select(FD_SETSIZE, &fd_supervised, &fd_ping, NULL, NULL);
//retrieve the message from the server
if(FD_ISSET(sdServ, &fd_supervised))
{
server.RecvFrom(msg,from);
cout << "recu : " << msg << "\n\n" << endl;
}
//supervise sd writing
if(FD_ISSET(sdClient, &fd_supervised))
{
sleep(10);
client.SendTo(msg,"127.0.0.1",12345);
}
}//while
}//main() |
Je fais de la PO (C++). Les wrappers marchent bien, testé plusieurs fois.
Je maitrise pas très bien les readfds et writefds et je ne trouve pas la solution, peut être faut-il une deuxième socket? Je pense qu'une seule devrait suffire, en plus ca m'arrangerait.
Merci, a bientot.
petite erreur dans le code
petite erreur dans la deuxiemme condition "if". Le fd_set de sdClient est fd_ping.
Code:
1 2 3 4 5 6 7
|
//supervise sd writing
if(FD_ISSET(sdClient, &fd_ping))
{
sleep(10);
client.SendTo(msg,"127.0.0.1",12345);
} |
je viens de tester les wrappers
Pour faire preuve de ma bonne fois je viens de tester les wrappers qui marchent nickel.
Voici les 2 programmes que j'ai lancé :
Pour le serveur
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
int main(int argc,char **argv)
{
//initialization
UDPsocket server;
int sdServ = server.Open(12345);
NetworkBox from;
string msg = "";
while(1)
{
server.RecvFrom(msg,from);
cout << "recu : " << msg << "\n\n" << endl;
}//while
}//main() |
Pour le client
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
int main(int argc,char **argv)
{
UDPsocket client;
int sdClient = client.Connect("127.0.0.1",12345);
NetworkBox from;
string msg = "HELLO 23456";
while(1)
{
sleep(10);
client.SendTo(msg,"127.0.0.1",12345);
}//while
}//main() |
Exemple de FD_SET qui marche
Voici un exemple de FD_SET que j'ai testé et qui marche.
Code pour le serveur :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
int main(int argc,char **argv)
{
//initialization
UDPsocket server;
int sdServ = server.Open(12345);
NetworkBox from;
string msg = "HELLO 23456";
//initialization of file descriptor list
fd_set fd_supervised;
while(1)
{
FD_ZERO(&fd_supervised);
FD_SET(sdServ,&fd_supervised);
select(FD_SETSIZE, &fd_supervised, NULL, NULL, NULL);
//retrieve the message from the server
if(FD_ISSET(sdServ, &fd_supervised))
{
server.RecvFrom(msg,from);
cout << "recu : " << msg << "\n\n" << endl;
}
}//while
}//main() |
Code pour le client :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
int main(int argc,char **argv)
{
//initialization
UDPsocket client;
int sdClient = client.Connect("127.0.0.1",12345);
NetworkBox from;
string msg = "HELLO 23456";
//initialization of file descriptor list
fd_set fd_ping;
while(1)
{
FD_ZERO(&fd_ping);
FD_SET(sdClient,&fd_ping);
select(FD_SETSIZE, NULL, &fd_ping, NULL, NULL);
//supervise sd writing
if(FD_ISSET(sdClient, &fd_ping))
{
sleep(3);
client.SendTo(msg,"127.0.0.1",12345);
}
}//while
}//main() |
Le problème c'est quand je joins les deux bouts de codes ca marche pas. Ca doit etre au niveau du select(). En fait je me prends la tête car je voudrais après utiliser qu'une seule socket et la surveiller en lecture/écriture.