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 :

[Débutant][Sockets] Server en C++, client en Java


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut [Débutant][Sockets] Server en C++, client en Java
    Salut,

    Je m'ammuse en ce moment à faire un petit daemon pour les serveurs de ma boite, et je voudrais le faire en C++ histoire d'avoir un exécutable et pas être obligé d'avoir java qui tourne... Enfin bref.

    J'ai suivi plusieurs tutoriels et pioché à droite à gauche pour faire un serveur en C++ qui écoute sur une socket sur le port 15000.
    Il attend bien la connexion, "logs à l'appui" (en supposant que ca plante si ca fonctionne pas ).

    Bon, sans plus attendre, le code de la bête :

    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
     
    #include <cstdlib>
    #include <iostream>
    #include <winsock2.h>
    #pragma comment(lib, "ws2_32.lib")
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
        WSADATA WSAData;
        WSAStartup(MAKEWORD(2,0), &WSAData);
     
        SOCKET sock;
        SOCKADDR_IN sin;
        sin.sin_addr.s_addr	= inet_addr("127.0.0.1");
        sin.sin_family		= AF_INET;
        sin.sin_port		= htons(15000);
        sock = socket(AF_INET,SOCK_STREAM,0);
        bind(sock, (SOCKADDR *)&sin, sizeof(sin));
     
        listen(sock, 0);
        int val = 0;
     
        int sizeSin = sizeof(sin);
     
        cout << "created socket on port 15000" << endl;
        cout << "now listening" << endl;
     
        while(1)
        {
            val = accept(sock, (SOCKADDR *)&sin, &sizeSin);
            if(val != INVALID_SOCKET)
            {
                   char* buffer=new char[1024];
                   int retour = 0;
                   retour = recv(sock,buffer,sizeof(buffer),0 );
                   if (retour == SOCKET_ERROR) 
                   {
                      cout << "erreur lors de la lecture" << endl << "errno : " << WSAGetLastError() << endl;
                      continue;
                   }
                   else
                   {
                       if(strcmp(buffer,"SHUTDOWN")==0)
                       {
                           cout << "SHUTDOWN RECEIVED"<<endl;
                       }
                   }
            }
        }
     
     
        cout << "ciyciy" << endl;
        cout << "test" << endl;
        system("PAUSE");
        //return EXIT_SUCCESS;
    }
    et mon client en java qui se connecte, envoie SHUTDOWN et se déconnecte :

    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
     
    import java.net.*;
     
    public class TestDaemon
    {
    	TestDaemon()
    	{
    	}
     
    	public static void main(String[] args)
    	{
    		try
    		{
    			Socket s=new Socket("localhost",15000);
    			s.getOutputStream().write("SHUTDOWN".getBytes(),0,8);
    			s.getOutputStream().flush();
    			s.close();
    		}
    		catch(Exception e)
    		{
    			e.printStackTrace();
    		}
     
    	}
    }
    Le client ne me renvoie aucune erreur.

    Voici le log du serveur :

    created socket on port 15000
    now listening
    erreur lors de la lecture
    errno : 10057
    J'ai un peu cherché sur le net à propos de l'erreur 10057 mais j'ai soit rien compris soit rien trouvé d'interressant. Visiblement la socket est pas connectée et donc a refusé la connexion () d'où mon incompréhension.

    Alors ma question est : D'où que ca cloche ? C'est grave docteur ?


    Autre chose, il semblerai que, puisque j'ai donné comme inet_address 127.0.0.1 à ma socket, elle n'accepte que les connexions de moi sur moi même, et pas de l'extérieur. Si je ne mets pas de inet_address, alors le socket n'accepte aucune connexion. Comment faire pour qu'il accepte la connexion de n'importe quelle ip ?

    Merci d'avance

    F.

  2. #2
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    Bonjour,

    J'ai trouvé pourquoi la socket n'était pas connectée, il faut écouter avec la socket que accept nous renvoie.

    Maintenant j'ai un nouveau probleme :

    J'en voie "SHUTDOWN" et je ne recois que "SHUT". Or, si j'envoie "SHUTDOWN coucou coucou coucou" je ne recois toujours que "SHUT".
    Pourquoi ?

    Merci d'avance.

    Fred.

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char* buffer=new char[1024];
    retour = recv(sock,buffer,sizeof(buffer),0 );
    sizeof(buffer) vaut 4, c'est un pointeur d'où les 4 caractères que tu recois ("SHUT")

    Il faudrait faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    retour = recv(sock,buffer,1024,0 );
    et même mieux avoir une constante pour l'allocation et la réutiliser pour la lecture
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    Salut,

    merci de ta réponse rapide.

    Je viens de faire ca apres m'être souvenu de mes vieux cours de C++ (qui commencent à dater mine de rien) que la taille d'un pointeur c'était 4.

    Maintenant je recois bien mon SHUTDOWN, et ca me renvoie bien 8 caractères.
    Tout fonctionne très bien, merci beaucoup !!

    Fred, qui a encore beaucoup à faire pour se dérouiller en C++

  5. #5
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    Au fait, comment faire pour que la socket qui écoute écoute toutes les adresses ? actuellement elle refuse toutes les connexions qui ne viennent pas de localhost.

    Merci

    F.

  6. #6
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sin.sin_addr.s_addr = htonl(INADDR_ANY);
    Cordialement.

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

Discussions similaires

  1. [C/C++]Socket Server/Client
    Par X-K4l1 dans le forum Développement
    Réponses: 5
    Dernier message: 03/12/2013, 12h08
  2. Connexion Java(server) et Python(client)
    Par xeerox23 dans le forum CORBA
    Réponses: 1
    Dernier message: 01/12/2009, 17h22
  3. [WebService]Server Delphi et client Java
    Par davels dans le forum Web & réseau
    Réponses: 12
    Dernier message: 05/06/2008, 11h11
  4. Réponses: 5
    Dernier message: 11/03/2006, 16h18
  5. [Socket] Probleme entre un Client C et un serveur JAVA
    Par bpy1401 dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 28/02/2006, 08h40

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