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

Réseau C Discussion :

Socket TCP, serveur C, client PHP


Sujet :

Réseau C

  1. #1
    Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Socket TCP, serveur C, client PHP
    J'essaie de développer une petite application permettant à un client PHP d'envoyer des informations à un serveur C via des sockets.

    Niveau code source, j'ai pour 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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    #include <sys/types.h>
    #include <sys/socket.h>
     
    #include <stdio.h>
     
     
     
    #define PORT_SERV 23456
    #define ADDR_SERV "192.168.239.245"
     
    int main ()
    {
    	int err;
    	// l'identifiant de la socket client
    	int socket_serveur;
    	int socket_client;
     
    	int msg;
     
    	// l'adresse de la socket serveur
    	struct sockaddr addr_serveur = {AF_INET,htons(PORT_SERV), htonl(ADDR_SERV)};
     
    	//l'adresse de la socket client
    	struct sockaddr addr_client;
    	int socket_client_taille;
     
    	//------------------------------------------
    	// on crée une socket et on recupère son descripteur. Les param :
    	//PF_INET,le domaine, signifie qu'on utilise IPv4
    	//SOCK_STREAM, pour dire qu'on envoye un flux
    	//0, mais on c'est deja que c'est du TCP
    	socket_serveur = socket(AF_INET, SOCK_STREAM, 0);
     
    	//------------------------------------------
    	// dans le cas du serveur il faut faire un bind
    	// identifiant de la socket
    	// adresse de la socket
    	// taille de l'adresse
    	bind(socket_serveur,&addr_serveur,sizeof(addr_serveur));
     
     
    	//------------------------------------------
    	// on attend une connection
    	// on attend 1 connection sur la socket serveur
    	listen(socket_serveur, 3);
     
    	//------------------------------------------
    	//on accepte une connection
    	// sur la socket serveur
    	// venant d'une addresse client
    	// de taille...
    	socket_client = accept(socket_serveur,&addr_client, &socket_client_taille);
     
    	printf("La socket du client : %d\n", socket_client);
     
     
    	//------------------------------------------
    	// on attend un message
    	// identifiant de la socket du client
    	// adresse pour recevoir le message
    	// taille de la zone de message
    	// des options
    	err = recv(socket_client,&msg, 4,0);
     
    	printf("\nOn a lu %d octect\n",err);
    	printf("\nLe message est le suivant : %d\n",msg);
     
     
    	//------------------------------------------
    	// on ferme la socket
    	close(socket_serveur);
     
    	return 0;
    }
    Pour ce qui est du client PHP, j'ai :
    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
    <?php
    	// on crée la socket
    	// pour IPv4
    	// pour des flux
    	// pour le protocole TCP
    	$socket_client = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
     
    	echo("La valeur de l'identifiant de la socket : <br>");
    	echo($socket_client);
     
     
    	// il faut faire un bind de notre socket
    	$err = socket_bind($socket_client, "192.168.239.245", 23457);
     
    	if ($err === TRUE)
    	{
    		echo("<br>Lien cree<br>");
    	}
     
     
    	// on se connecte au serveur
    	$err = socket_connect($socket_client, "192.168.239.245", 23456);
     
    	if ($err === TRUE)
    	{
    		echo("Connection cree<br>");
    	}
    	else
    	{
    		echo ($err);
    	}
     
    	$msg = 'test';
    	$taille = strlen($msg);
    	echo($taille);
     
     
    	// ensuite on envoi le message
    	// l'identifiant de la socket emetrice
    	// le message
    	// la longueur du message
    	// les options
    	// l'adresse IP destinatrice
    	// le port destinnataire
    	if(socket_send($socket_client, $msg, $taille, 0x100) !== FALSE)
    		echo ("Message envoye correctement");
     
    	//on ferme la socket
    	socket_close($socket_client);
    ?>
    Je lance le serveur, puis je lance le client, et la j'ai un message d'erreur

    Warning: socket_connect(): unable to connect [111]: Connection refused in <le nom de mon fichier> line 22
    Voila, je sais qu'il est possible de parler via des socket d'une application PHP à une application C. Mais la je ne vois pas pourquoi ça ne marche pas. J'ai pensé à des problème de droits... mais bon. Quelqu'un a une idée ?

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Citation Envoyé par Alastor Nephos Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // l'adresse de la socket serveur
    struct sockaddr addr_serveur = {AF_INET,htons(PORT_SERV), htonl(ADDR_SERV)};
    Je pense qu'il peut y avoir un problème avec le bind côté serveur : il faut dire au socket qu'il doit accepter les connection quelque soit l'adresse IP d'origine.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // l'adresse de la socket serveur
    struct sockaddr addr_serveur = {AF_INET,htons(PORT_SERV), htonl(INADDR_ANY)};

  3. #3
    Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Je viens d'essayer, ça ne fonctionne pas mieux...

  4. #4
    Membre confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Points : 622
    Points
    622
    Par défaut
    Citation Envoyé par Alastor Nephos Voir le message
    Je viens d'essayer, ça ne fonctionne pas mieux...
    C'est quoi l'erreur?

  5. #5
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par Alastor Nephos Voir le message
    Je viens d'essayer, ça ne fonctionne pas mieux...
    Oui, ma réponse était incomplète : il faut utiliser sockaddr_in et non sockaddr
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      struct sockaddr_in addr_serveur =
          { AF_INET, htons (PORT_SERV), htonl (INADDR_ANY) };

  6. #6
    Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    OK, j'ai modifié un peu mon programme est ça fonctionne effectivement en utilisant cette struct. Merci beaucoup !!

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

Discussions similaires

  1. Discussion client serveur, socket TCP
    Par darktimide dans le forum Réseau
    Réponses: 3
    Dernier message: 23/12/2012, 21h18
  2. [SOCKET] TCP client/serveur
    Par hxh2008 dans le forum Réseau
    Réponses: 3
    Dernier message: 25/11/2011, 17h01
  3. socket multiThread serveur JAVA / client FLEX
    Par aliong dans le forum Flex
    Réponses: 2
    Dernier message: 28/08/2009, 20h06
  4. Réponses: 12
    Dernier message: 05/06/2009, 22h01
  5. Réponses: 1
    Dernier message: 18/03/2008, 16h33

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