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

C Discussion :

Serveur Multi Thread en C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 66
    Par défaut Serveur Multi Thread en C
    bonjour a tous est a toute,

    Je cherche a développer un serveur Multi Thread en C sur les plateforme windows et unix.

    Malheureusement je ne m'en sort pas.

    J'aurai besoin de conseils avisé sur les librairie a utiliser, ainsi que exemple si sa existe.

    Mon serveur doit se connecter a plusieurs clients simultanément, grâce a leur adresse IP.


    ps: google ne pas beaucoup aidé dans m'ai recherche.


    Cordialement

  2. #2
    Membre Expert
    Avatar de nbenbourahla
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 41
    Par défaut
    Bonjour

    "Mon serveur doit se connecter a plusieurs clients simultanément, grâce a leur adresse IP" -> désolé mais c'est faux un serveur ne se connecte pas au client, il accepte juste les connexions des clients

    Premiére chose a faire c'est :
    - Créer une socket (grace a la fonction socket)
    - tu la bind (fonction bind)
    - tu utilise listen pour ecouter sur le port
    et finalement accepte pour accepter un client

    http://linux.die.net/man/3/gethostbyaddr
    Cette fonction permet de recuperer les info du client a partir de son adresse IP

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

    En fouillant un peu sur le forum, on peu trouver quelques exemples.
    En voici un que j'ai posté il y a quelque temps : http://www.developpez.net/forums/d63...e/#post3718351. C'est un serveur http minimal qui fonctionne avec listen / accept.

  4. #4
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 2
    Par défaut
    Bonjour,
    Tout d'abord, qu'est ce qui te bloque ? le coté création de serveur ? ou le fait qu'il sois multithreadé ? Pour la création d'un serveur, google est rempli de magnifique exemple (voir post précédent) et pour le coté multithreadé, tout dépends de ce que tu cherche à faire avec (es tu sur que un select ne te suffirais pas ?)
    Pour le coté Unix/Windows, pas de soucis, windows est POSIX (ahaha XD) donc logiquement (à quelques changement près, surtout l'init d'une lib sous windows) le code pour les sockets sera le même, ce n'est pas le cas pour les threads en revanche.

  5. #5
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 66
    Par défaut
    bonjour, voila se qui me bloque.

    Je doit réalisé un outil de supervision de serveur Unix.

    En réalité mon serveur tcp ip sera aussi un client, je m'explique :

    le programme en C ou C++ devra être capable de recevoir un ordre grâce a un site internet, puis de lancer un ordre a chacun des client.
    Puis un fois que la partie cliente a finie d'exécuter les script, il devra envoyer au serveur un fichier txt.

    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
    function envoi_serveur($envoi)  /* Permet l'envoie de la commande au serveur*/
    	{
    			$port = 10000;  /*définition du port */
    			$adresse = "127.0.0.1"; /*définition de l'adresse ip du serveur */
    			
    			$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);/* Cree une socket TCP/IP. */
    				if ($socket < 0)  /*Si le socket ne c'est pas créé */
    					{
    					echo "socket_create() a échoué : raison :  " . socket_strerror ($socket) . "<br />"; /*affiche l'erreur */
    					}
    					
    				else /* Sinon*/
    					{
    						
    						$resultat = socket_connect($socket,
    qui envera un code qui ressemble a celui ci : 10XTOT-pprod


    ma partie serveur ressemble a ceci

    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
    #include <cstdlib>
    #include <iostream>
    #include <fstream>
    using namespace std;
    #include <winsock2.h>
     
     
    int main(int argc, char *argv[])
    {
        // Initialisation
        WSADATA initialisation_win32;
        int erreur=WSAStartup(MAKEWORD(2,2),&initialisation_win32);
        if (erreur!=0)
        {
            cout << "Desole, je ne peux pas initialiser Winsock du a l'erreur : ";
            cout << erreur << " " << WSAGetLastError() << "\n\n";
            system("PAUSE");
            return -1;
        }
        else
        {
              cout << "WSAStartup  : OK\n";
        }
    mais malheureusement rien ne se passe.
    pourtant, un client PHP reçoit bien le message alors que le client C++ ne reçoit rien.

    Cordialement

  6. #6
    Invité(e)
    Invité(e)
    Par défaut
    Ta requête ressemble à : 10XTOT-pprod

    Or, tu lis la taille du nom de fichier comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int nombre_de_caractere=recv(id_de_la_nouvelle_socket,(char*)&buffer2,4,0);
    Tu envois "10" en mode texte et tu tentes de le lire en mode binaire... ça ne peut pas fonctionner.

    Supposons que la taille du nom de fichier soit toujours stockée sur deux caractères, on peut la lire comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    char buffer[4096]; long buffer2;
    char taille[2+1] = "";
        // Reçois la taille du nom du fichier (4 octet ou 32 bits)
        int nombre_de_caractere=recv(id_de_la_nouvelle_socket,taille,2,0);
        if (nombre_de_caractere==SOCKET_ERROR)
        {
            cout << "Erreur, je n'ai pas recu la taille du nom de fichier !\n\n";
            system("PAUSE");
            return -1;
        }
        buffer2 = strtol(taille, NULL, 10);
    EDIT : Mon doigt a glissé, c'est strtol et pas strtod qu'il fallait lire. /EDIT

    PS : ton protocole est il bien défini ?
    Dernière modification par Invité(e) ; 10/06/2009 à 10h19. Motif: strtod --> strtol

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/11/2006, 23h21
  2. [C++][serveur multi-threads] prob de connection
    Par Just_the_boss dans le forum C++
    Réponses: 4
    Dernier message: 23/02/2006, 19h09
  3. [Socket] un serveur multi thread
    Par mzt.insat dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 12/11/2005, 13h25
  4. Réponses: 7
    Dernier message: 19/10/2004, 19h09
  5. Réponses: 16
    Dernier message: 30/01/2004, 11h05

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