je suis actuellement en train de m'attaquer à l'apprentissage de l'utilisation de socket. Je travaille sous Ubuntu Edgy. J'ai deja fait le test de faire communiquer un client et un serveur en utilisant la boucle locale. Ma question est de savoir s'il est possible que je fasse tourner un client et un serveur dans un même programme en utilisant les descripteurs de fichiers.
Mon idée est la suivante:
Tout d'abord je crée un set de descripteur de fichiers avec:
fd_set master int fd_max
Puis dans le fichier principal, je taperais un truc de ce genre:
#define PORT_CLIENT 5060
#define PORT_SERVER 7000
int client_fd;
int server_fd;
fd_set read_fds;
struct timeval tv;
/*
J'utilise ici la structure timeval pour fixer un timeout à 10 ms
*/
tv.tv_sec = 0;
tv.tv_usec = 10;
FD_ZERO(&master);
FD_ZERO(&read_fds);
/*
J'initialise ici un descripteur de fichier pour le serveur et le client. Les procédures client_start() et server_start() retournent ce socket.
*/
client_fd = client_start(PORT_CLIENT);
server_fd = server_start(PORT_SERVER);
FD_SET(client_fd,&master);
FD_SET(server_fd,&master);
FD_SET(0,&master);
/*...*/
/*Boucle principale*/
while(1)
{
read_fds = master;
if (pselect(fdmax+1,&read_fds,NULL,NULL,&tv,NULL) <0)
/*controle d'erreur*/
if (FD_ISSET(0,&read_fds)) // On lit quelque chose dans le descripteur de fichier de stdin
{
/*Action a entreprendre en conséquence*/
}
if(FD_ISSET(client_fd,&read_fds))
{
/*Le client a reçu quelque chose provenant du serveur, il répond en conséquence*/
}
if (FD_ISSET(server_fd,&read_fds))
{
/*Le serveur reçoit un message provenant du client, il réagit en conséquence en traitant le message dans la partie application*/
}
}
Lire l'entrée de stdin permet de sortir de la boucle infinie. Est-ce que l'idée pourrait marcher?
Johnny
