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

Linux Discussion :

Winsock != unix's sock || Handle != pthread ?


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    la_tupac
    Invité(e)
    Par défaut Winsock != unix's sock || Handle != pthread ?
    Salut a vous!
    J'espere qu'une note d'humour est tolérée dans les sujets en tout cas le mien est assez explicite je pense:

    Voila j'ai dévelopé un serveur multithread pour un jeu de ma conception. Ce serveur est basé sur ce tuto : http://khayyam.developpez.com/articl.../multithreads/

    Tuto génial !! sincérement !! Mais voila, pas d'équivalence Linux à ma connaissance et justement il me faut une version linux de mon serveur.
    J'ai donc commencé à convertir le tuto grace aux sockets unix et aux threads posix et j'y suis parvenu (compil impec sans warn). Cependant, il ne fonctionne pas: je n'ais pas encore débugué ça mais de deux choses l'une :
    - Soit l'accept ne fonctionne pas
    - Soit le lancement du thread est un echec.

    J'avais au préalable fait un essai en partant de rien et le résultat était le même.

    Ma question finale est: pensez-vous que ce tuto est poratble linux ou est-ce-que le fonctionnement de linux l'interdit ??

    Merci.

  2. #2
    la_tupac
    Invité(e)
    Par défaut
    Merci a ceux qui ont regardé
    Je ne laisse plus le suspens raigner
    En fait mon code était bon, Linux gère parfaitement cet algo, mon erreur était leQui était complètement foireux sous tux. Je l'ai simplement remplacé paret le tour est joué. En tant que farouche défenseur du GNU je me dois de donner mes sources si vous voulez un article sur le site faites moi un MP ou voyez un modo pour qu'il me contacte, je compte bien rester actif ici. Les gens sont sérieux et pragmatiques.

    a bientôt

    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include "serveur.cpp"
    #include <iostream> 
     
    using namespace std;
     
    int main(){
     
    	serveur *MyServer = new serveur(1000); //non petits voyous, le port 1000 n'est pas ouvert chez moi :p
    	MyServer->init();
    	MyServer->start();
    	return 0;
    }
    serveur.cpp
    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
    75
    76
    77
    78
    79
    80
    81
    #include <sys/types.h>  /* Primitive System Data Types */ 
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <pthread.h> 
    #include <netdb.h>
    #include <string.h>
    #include <iostream>
    #include "serveur.h"
     
    #define _MAX_HOST_LENGTH_ 100
     
    using namespace std;
     
     
    serveur::serveur(int p){
    	port	= p;
    	running	= false;
    }
     
    int serveur::init(){
    	struct in_addr  MyAddress;
    	struct hostent  *host;
    	char HostName[_MAX_HOST_LENGTH_];
     
    	gethostname( HostName, _MAX_HOST_LENGTH_ );
    	host = gethostbyname( HostName );
    	memcpy( &MyAddress.s_addr, host->h_addr_list[0], sizeof( MyAddress.s_addr ) );
     
    	ServerAddr.sin_family = AF_INET;
    	ServerAddr.sin_port = htons( port );
    	ServerAddr.sin_addr.s_addr = INADDR_ANY ;
     
    	cout <<"server initialized" << endl;
    	return 0;
    }
     
    int serveur::start (){
    	struct sockaddr_in          ClientAddr;
    	socklen_t                   ClientAddrLen;
    	pthread_t                   hProcessThread;
    	int                         NewConnection;
    	struct thread_param         p;
     
    	ListeningSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ) ;
     
    	cout << "bind:" << bind( ListeningSocket, (sockaddr *)&ServerAddr, sizeof( ServerAddr ) ) << endl;
    	cout << "listen:" << listen( ListeningSocket, 5 ) << endl;
     
    	cout << "server started : listening to port: " << port << endl;
    	running = true;
    	ClientAddrLen = sizeof( ClientAddr );
     
    	while(running){
    		cout<<"wait accept"<<endl;
    		NewConnection = accept( ListeningSocket, (sockaddr *) &ClientAddr, &ClientAddrLen);
    		cout<<"accepted:"<<NewConnection;
    		p.ser = this;
    		p.soc = NewConnection;
    		cout << "client conected ::  IP : " <<inet_ntoa( ClientAddr.sin_addr )<< " ,port = " <<ntohs( ClientAddr.sin_port ) << endl;
    		pthread_create (&hProcessThread, NULL, &serveur::ThreadLauncher, &p);
    	}
    	return 0;
    }
     
    int serveur::pause (){
    	running = false;
    	cout << "Serveur en pause" << endl;
    	close( ListeningSocket );
    	return 0;
    }
     
    /* ======================================================================== */
    /* ========================== thread proc ================================= */
    /* ======================================================================== */
     
     
    void serveur::ClientThread(int soc){
    	cout << "kikou" << endl;
    	/*    A mettre ici : code relatif au protocole utilisé    */
    }
    serveur.h
    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
    #ifndef __serveur_h__ 
    #define __serveur_h__ 
    #include <unistd.h>     /* Symbolic Constants */
    #include <sys/types.h>  /* Primitive System Data Types */ 
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <iostream>
    #include <netdb.h>
     
    class serveur;
     
    struct thread_param{
           serveur* ser;
           int soc;
    };
     
    class serveur{
    	private: 
    		int           port;
    		int	      ListeningSocket;
    		bool          running;  
    		struct sockaddr_in   ServerAddr;   
    		void ClientThread(int);  
    	public:                                        
    		serveur(int);
    		int                 init();
    		int                 start ();  
    		int                 pause ();
    		static void *ThreadLauncher(void *p){
    			struct thread_param *Obj = reinterpret_cast<struct thread_param*>(p);               
    			serveur *s = Obj->ser;                          
    			s->ClientThread(Obj->soc);       
    		}
    }; 
    #endif

Discussions similaires

  1. WinSock unix et IPv6
    Par ChMeessen dans le forum Réseau
    Réponses: 1
    Dernier message: 17/02/2010, 21h39
  2. winsock.h et portabilité unix
    Par zais_ethael dans le forum MFC
    Réponses: 12
    Dernier message: 25/10/2005, 18h51
  3. pb de récup de handle à partir d'une dll
    Par yokito dans le forum Langage
    Réponses: 2
    Dernier message: 20/08/2002, 12h29
  4. pb de handle en C
    Par deedje dans le forum C
    Réponses: 3
    Dernier message: 21/06/2002, 16h19
  5. [Kylix] equivalent winsock avec kylix
    Par Victor dans le forum EDI
    Réponses: 2
    Dernier message: 08/05/2002, 07h43

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