IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Sockets


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 110
    Points : 42
    Points
    42
    Par défaut Sockets
    Bonsoir à tous

    je me suis penché sur l'utilisation de socket en php mais j'ai rencontré quelques problèmes. Je m'explique...

    J'ai sur un serveur un programme en C qui a une socket d'écoute et qui joue le rôle de Serveur.

    De l'autre côté, mon script php doit jouer le client. Ma petite application "test" consiste à envoyer via une socket un nombre au programme C qui me retournera le carré de celui-ci pour l'afficher ensuite sur la page.

    Lors de l'exécution de mon script php, celui-ci tourne en boucle et j'ai ma page internet qui s'affiche un nombre infini de fois sur la page de façon décallé.


    Voici mon script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    <?php
     
        $serveur  = "127.0.0.1";
     
     
        $idSocket = fsockopen('127.0.0.1',5000, $codeErreur, $msgErreur);
        if (!$idSocket) {
            echo "La connexion via la socket a échouée.<br />";
            echo "Code d'erreur: $codeErreur<br />";
            echo "Message d'erreur: $msgErreur<br />";
            die();
        }
     
     
        // Envoi de données au serveur
        fputs($idSocket, "3"); 
        fputs($idSocket, "\r\n");                  // Marque la fin de l'entête
     
        // Lecture de la réponse
        while (!feof($idSocket))
        {
            echo fgets($idSocket, 512);
        }
        fclose($idSocket);
    ?>
    J'ai lancé sur le serveur mon programme serveur qui est à l'écoute sur le même numéro de port. Je teste en local.

    Si je dois éclaircir certains points n'hésitez pas.
    Merci d'avances

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Je suppose que le serveur n'envoit pas l'instruction de fin ; je ne sais pas quelle forme c'est censé prendre ; tu pourrais cependant la faire manuellement en faisant envoyer par le serveur une instruction "END" comprise par ton client.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 110
    Points : 42
    Points
    42
    Par défaut
    J'ai essayé avec un code de fin que le serveur enverrai mais ça ne marche toujours pas.

    Mn serveur envoi END à la fin et j'avais donc rajouté comme condition dans la boucle while de mon script php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    while (!feof($idSocket) || !($retour=="END"))
    {
    $retour = fgets($idSocket, 512);
    echo $retour;
    }
    ?>
    mais rien ne change.

    Ce que je trouve bizzare c'est que, sur mon serveur, j'ai mit une instruction qui m'affiche "Ok" quand il reçoit bien le message du client mais le "Ok" ne s'affiche jamais.

    De plus j'ai essayé, dans mon script php, de me contenter d'envoyer un message dans la socket sans attendre de retour (c'est à dire que j'ai retiré toute la boucle while et je ferme la socket directement) mais là aussi le script boucle toujourset ma page internet s'affiche sans arret dans la même page.

    Je peux toujours mettre mon code côté serveur mais j'ai testé mon serveur avec un client en C et il fonctionne parfaitement. Je pense alors que ça vient de mon script php

    Voici mon serveur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    #include<stdio.h>
    #include<stdlib.h>
    #include <netinet/in.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <sys/un.h>
    #include <unistd.h>
    #include  <signal.h>
     
    int socket_id;
     
    void close_socket()
    {
    	close(socket_id);
    	exit(0);
    }
     
    int main()
    {	
    	struct sockaddr_in adresse;
    	adresse.sin_family = AF_INET;
    	adresse.sin_port = htons(5000);
    	adresse.sin_addr.s_addr=inet_addr("127.0.0.1");
     
    	int addr_size = sizeof(adresse);
    	int num=0;
    	char fin[] = "END";
     
     
    	socket_id = socket(AF_INET,SOCK_STREAM,0); //Creation de la socket
     
    	bind(socket_id, (struct sockaddr*) &adresse, addr_size);//Définition de l'adresse locale
     
    	listen(socket_id, SOMAXCONN);//création de la file d'attente
     
    	int s=0;
     
    	while(1)
    	{
    		s = accept(socket_id, (struct  sockaddr*)&adresse, &addr_size);
    		int p=fork();
    		if(p>0)
    		{
    			wait(NULL);
    		}
     
    		else
    		{
    		   	recv(s, &num, sizeof(int), 0);
    			num=num*num;
    			printf("Ok\n");
    			send(s,&num,4,0);
    			send(s,&fin,100,0);
    		}
    		close(s);
    	}	
    }

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 243
    Points
    20 243
    Par défaut
    Ton serveur attend un int et tu lui envoi un char donc c'est normal que tu boucle indéfiniment.
    Pour envoyer 3 tu dois en fait envoyer 4x un octet (puisque que ton serveur attends un int)
    Ces 4 octets envoyé étant un décallage de bit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $nombre = 3;
    chr((($nombre)&0xFF000000)>>24);
    chr((($nombre)&0x00FF0000)>>16);
    chr((($nombre)&0x0000FF00)>>8);
    chr((($nombre)&0x000000FF));

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 110
    Points : 42
    Points
    42
    Par défaut
    J'ai fait quelques test mais toujours sans succès

    J'ai l'impression que PHP n'arrive même pas à établir une connexion avec le serveur car, dans mon code serveur, après la fonction qui accepte j'ai demandé qu'il affiche "Ok" mais jamais rien ne s'affiche sur le serveur...

    J'en déduis donc que mon serveur n'a pas de connexion dans sa file qu'il doit accepter.

    J'utilise bien la bonne adresse en local quand même?


    EDIT : je viens de trouver pourquoi l'affichage se faisait en boucle et de façon décallé, je faisait un include de la même page.
    Maintenant la connexion entre mon client et mon serveur fonctionne.

    Merci à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. executer une application a distance : Sockets ? RPC ? CORBA?
    Par a_hic dans le forum Développement
    Réponses: 5
    Dernier message: 30/05/2006, 13h02
  2. raw socket et langage c
    Par SlayDave dans le forum Développement
    Réponses: 2
    Dernier message: 29/08/2002, 19h09
  3. socket
    Par ben91 dans le forum Développement
    Réponses: 5
    Dernier message: 13/08/2002, 11h04
  4. Socket:Envoyer du texte d'un serveur vers tout les clients
    Par cedm78 dans le forum Web & réseau
    Réponses: 7
    Dernier message: 01/08/2002, 16h40
  5. transfert d'un fichier bitmap en socket tcp
    Par localhost dans le forum C++Builder
    Réponses: 5
    Dernier message: 29/07/2002, 00h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo