krocky | Salut !
Alors, voila mon problème. J'ai crée un serveur en C qui attend des données de nimporte quel client.
Voici son code :
Code :
- int web ()
- {
- //Declaration des variables locales propres aux sockets !
- WSADATA WSAData; //Propre à Winsock2
- SOCKET sock_ecoute; //Identifiant de la socket d'écoute
- SOCKET sock_trait; //Identifiant de la socket de traitement
- SOCKADDR_IN adr; //Structure de la socket locale
- SOCKADDR_IN appelant; //Structure de la socket distante
- int lg_app; //Taille de la structure appelante
- int count; //Nombre d'octets reçus sur la socket
- char buffer[16]; //Buffer de réception
- fd_set ensemble;
- struct timeval timeout={5,0};
-
- //On démarre l'appli winsock2 nécessaire à l'utilisation de sockets sous windows
- if(WSAStartup(MAKEWORD(2,0), &WSAData) != 0)
- {
- printf("Impossible d'initialiser l'API Winsock 2.0\n" );
- return 0;
- }
-
- //On crée une nouvelle socket TCP
- sock_ecoute = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
- if(sock_ecoute==INVALID_SOCKET)
- {
- printf("Echec de création de la socket !\n" );
- return 0;
- }
-
- //On remplit la structure de notre socket
- adr.sin_addr.s_addr = INADDR_ANY; //On accepte des connexions de nimporte qui
- //adr.sin_addr.s_addr = inet_addr("127.0.0.1" );
- adr.sin_family = AF_INET; //Application basée sur TCP/IP
- adr.sin_port = htons(PORT); //PORT définit dans main.h
-
- //On attache la socket à notre structure
- if(bind(sock_ecoute, (SOCKADDR *)&adr, sizeof(adr)) !=0)
- {
- printf("Impossible d'attacher la socket\n" );
- return 0;
- }
-
- //On place notre socket en écoute
- if(listen(sock_ecoute, 0) !=0 )
- {
- printf("L'écoute sur la socket a échoué\n" );
- return 0;
- }
- lg_app=sizeof(appelant);
-
- while(1) //Boucle infinie, la seule façon de quitter est ctrl+c
- {
- printf("En attente d'une connexion\n" );
-
- //On attend qu'un client se connecte (fonction bloquante)
- sock_trait = accept(sock_ecoute, (SOCKADDR *)&appelant, &lg_app);
- if(sock_trait==INVALID_SOCKET)
- {
- printf("Impossible d'accepter la connection entrante\n" );
- return 0;
- }
- printf("\n\nConnecté !\n\n" );
- //Le processus vient d'accepter une connexion, il ne pourra pas en recevoir
- //d'autre tant que cette communication ci ne sera pas terminée
-
- do
- {
- printf("\n\nEn attente de requètes de %s\n",inet_ntoa(appelant.sin_addr));
- memset(buffer,0,sizeof(buffer));
-
- FD_ZERO(&ensemble);
- FD_SET(sock_trait,&ensemble);
- printf("%d",select(0, &ensemble, 0, 0, &timeout));
- if(FD_ISSET(sock_trait,&ensemble)!=0)
- {
- printf("Des données sont arrivées.\n" );
- count=recv(sock_trait,buffer,16*sizeof(char),0);
- buffer[count]='\0';
- printf("Info reçue : %s sur %d octets\n",buffer,count);
- }
- else
- {
- printf("Toujours rien.\n" );
- }
- }while(count>0);
- //Si on sort de cette boucle, c'est que le client s'est déconnecté
-
- printf("\nLe client vient de fermer la socket\n" );
- //On ferme la socket de traitement, et on retourne en attente de connexion
- close(sock_trait);
-
- }//Fin de la boucle infinie
-
- }//Fin de web
|
De l'autre coté, j'ai un code PHP qui est censé envoyé des données à mon programme à partir d'un formulaire. Le voici (en partie):
Code :
- <?php
- $Serveur = "127.0.0.1";
- $Port = 8080;
- $ma_socket = pfsockopen($Serveur, $Port);// on crée la socket
- if(isset($_POST['bye']))
- {
- fclose($ma_socket);
- $ma_socket=0;
- }
- if($ma_socket<=0)
- echo '<font color="#FF0000"><b> Probleme de connexion avec le programme </b></font><br/>';
- else
- {
- echo '<font color="#009900"><b> Connecté au programme </b></font><br/>';
- if(isset($_POST['var']))
- {
- if(fputs($ma_socket, $_POST['var']))
- echo 'envoyé : $_POST['var'];
- }
- }
- ?>
|
Voila...
Tout ceci fonctionne parfaitement... mais pendant une durée limitée seulement !
En gros, je lance mon serveur (programme en C), puis, je lance firefox et me connecte à mon site en local (j'ai easy php), je sélectionne une valeur dans un menu déroulant qui l'envoie au code php ci-dessus, et ce dernier l'envoie bel et bien à mon serveur qui m'affiche la valeur choisie.
Je peux répeter cette opération autant de fois que je le veux sans qu'il y ait probleme.
Par contre, si je n'envoie plus rien pendant environ 15 secondes, mon serveur se bloque en réception et j'ai beau envoyé des données, le serveur s'en tête à m'afficher : "toujours rien" toutes les 5 secondes.
Alors, je suppose que soit mon code php soit mon code C crée une socket avec un timeout par défaut d'environ 15 secondes, mais, je trouve ça vraiment bizzare.
J'espère avoir été clair.
Comment faire pour pouvoir envoyer des données sans qu'une interruption bloque mon programme ? Quelqu'un aurait-il une idée ? Merci d'avance. |