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 :

Portage socket Linux -> windows


Sujet :

Réseau C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2015
    Messages : 1
    Points : 2
    Points
    2
    Par défaut Portage socket Linux -> windows
    Bonjour,

    J'ai codé un tchat en Tcp avec les socket sous Linux, il marche tres bien (connection , propagation des messages , deconection)
    Maintenant je veux faire le portage sous windows , j'ai donc remplacé toutes les variables par les macros windows , et j'ai adapté les tests.
    Le seul Probleme c'est au niveau du select() , qui renvoie -1 je ne sais pas pourquoi , ça enraye tout le fonctionnement car du coup un client ne peut ecrire qu'une seule fois apres quoi il passe en reception pour aucune raison.

    voici le code 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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
     
    #include <sys/types.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <errno.h>
    #include <string.h>
    #include <sys/time.h>
     
    #define BUF_LENGTH 256
    #define DNS "motamarid.ddns.net"
    #define PORT 30001
    #define UTF8 65001
    #define MAX_CLIENT 20
     
    #include <winsock2.h>
    #pragma comment(lib, "ws2_32.lib")
     
    void test(int aTester , char* sujet)
    {
        if(aTester)
        {
            printf("%s réussi.\n" , sujet);
        }
        else
        {
            printf("erreur de %s.\n" , sujet);
            exit(EXIT_FAILURE);
        }
    }
     
    int main()
    {
        SetConsoleOutputCP(UTF8);
        SetConsoleTitleA("(serveur)");
        //
        WSADATA WSAData;
        WSAStartup(MAKEWORD(2,0), &WSAData);
    	//variables
    	SOCKADDR_IN  serveur; // Br serveur
    	// traitement pour BR serveur
    	int descbr = socket(PF_INET, SOCK_STREAM,0);
    	test(descbr,"ouverture socket publique");
    	//
    	serveur.sin_family = AF_INET;
    	serveur.sin_addr.s_addr = INADDR_ANY;
    	serveur.sin_port=htons((short)PORT);
    	//BIND
    	int res = bind(descbr,(SOCKADDR*)&serveur,sizeof(serveur));
    	test(res!= SOCKET_ERROR,"bind");
    	//
    	int  i=0;
    	SOCKADDR_IN  client/*[MAX_CLIENT]*/; // Br client à accepter
    	SOCKET descrCli[MAX_CLIENT] ;
    	for( i = 0; i < MAX_CLIENT; i ++ )
            descrCli[i] = INVALID_SOCKET;
    	int taille = sizeof(client);
    	fd_set tab;//tableau de descripteur
    	struct timeval t;
    	t.tv_sec = (long)20;
    	t.tv_usec = (long)0;
    	int ret = 0, ecoute=0, j ,compteur = 0;
    	char buf[BUF_LENGTH];
    	//
    	while(1)
    	{
    		ecoute = listen(descbr,5);
    		test(ecoute!= SOCKET_ERROR , "listen");
    		//
    		FD_ZERO(&tab);//initialisation
    		FD_SET(descbr, &tab);
    		for(i = 0 ; i < compteur ; i++)
    		    if(descrCli[i] != INVALID_SOCKET)
    		    	FD_SET(descrCli[i], &tab);
     
    		printf("En attente d'evenement...\n");
    		ret = select(FD_SETSIZE, &tab, NULL, NULL, NULL);
    		test(ret != SOCKET_ERROR,"select");
    		if(FD_ISSET(descbr, &tab))
    		{
    		    //traitement client
    		    descrCli[compteur] = accept(descbr,(SOCKADDR*)&client,&taille);
    		    test(descrCli[compteur] != INVALID_SOCKET, "accept");
    		    printf("Client n°%d (de descripteur %d) accepté.\n",compteur,descrCli[i]);
    		    compteur++;
     
    		}
    		for(i = 0 ; i < compteur ; i++)
    		    if(descrCli[i] != INVALID_SOCKET && FD_ISSET(descrCli[i], &tab))
    		    {
                    int recevoir = recv(descrCli[i],buf,BUF_LENGTH,0);
                    //test(recevoir,"recv");
                    if(recevoir ==0) // si deconnection
                    {
                        printf("Client n°%d déconnecté.\n",descrCli[i]);
                        closesocket(descrCli[i]);
                        descrCli[i] = INVALID_SOCKET;
                        continue;
                    }
                    printf("Le client n°%d  (de descripteur %d) a dit la phrase[%s].\n",i , descrCli[i],buf);
                    for(j = 0 ; j < compteur ; j++)
                    {
                        if(j != i)
                        {
                            int result = send(descrCli[j],buf,BUF_LENGTH,0);
                            test(result!= SOCKET_ERROR,"send propagation");
                        }
                    }
                    memset(buf,0,BUF_LENGTH);
    		    }
    	}
        WSACleanup();
    	closesocket(descbr);
    	return 0;
    }
    et le client:

    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
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
     
    #include <sys/types.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <errno.h>
    #include <string.h>
     
    #define BUF_LENGTH 256
    #define DNS "motamarid.ddns.net"
    #define PORT 30001
    #define UTF8 65001
     
    #include <winsock2.h>
    #pragma comment(lib, "ws2_32.lib")
     
    void test(int aTester , char* sujet)
    {
        if(aTester)
        {
            printf("%s réussi.\n" , sujet);
        }
        else
        {
            printf("erreur de %s.\n" , sujet);
            Sleep(3000);
            exit(EXIT_FAILURE);
        }
    }
     
    void getIp(char* nom , char* adresse)
    {
    	struct hostent* mahostent = gethostbyname(nom);//roburc.ddns.net
    	test(mahostent != NULL , "gethostbyname");
    	struct in_addr addr;
     
    	unsigned char v[4];
    	int i=0,j=0;
    	printf("Le nom de %s est %s et possede les adresses suivantes\n", nom,mahostent->h_name);
    	while (mahostent->h_addr_list[i] != 0)
       	{
    		  for(j=0;j<4;j++)
          		  	v[j] = (unsigned char)mahostent->h_addr_list[i][j];
    		  sprintf(adresse , "%d.%d.%d.%d", v[0],v[1],v[2],v[3] );
    		  printf("adresse %d : %s\n" , i , adresse);
     
    		  i++;
    	}
     
     
    }
     
    int main()
    {
        SetConsoleOutputCP(UTF8);
        SetConsoleTitleA(DNS );
        //
    	WSADATA WSAData;
        WSAStartup(MAKEWORD(2,0), &WSAData);
        //
    	SOCKADDR_IN  serveur; // Br publique
    	char buf[BUF_LENGTH];
    	int j=0,i=0;
    	// traitement pour BR serveur
    	int descbrCli = socket(PF_INET, SOCK_STREAM,0);
    	test(descbrCli,"ouverture socket");
    	//
    	char adresse[256] = "";
    	getIp( "localhost", adresse);//"motamarid.ddns.net"
    	//
    	serveur.sin_family = AF_INET;
    	serveur.sin_addr.s_addr = inet_addr(adresse);
    	serveur.sin_port=htons((short)PORT);
    	// envoi de demande de connexion au serveur
    	int tailleServeur = sizeof(serveur);
    	printf("Demande de connexion en cours...\n");
    	int result = connect(descbrCli,(SOCKADDR *)&serveur,tailleServeur);
    	test(result >= 0,"connexion avec le serveur");
    	//
    	fd_set tab;
    	while(1)
    	{
    		FD_ZERO(&tab);
    		FD_SET(descbrCli, &tab);
    		FD_SET(0, &tab);
     
    		//write(1,"parlez: ",sizeof("parlez: "));
    		int ret = select(FD_SETSIZE, &tab, NULL, NULL, NULL);
    		test(ret != SOCKET_ERROR,"select");
     
    		if(FD_ISSET(0,&tab))
    		{
                            printf("Ecriture!\n");
    			fgets(buf, BUF_LENGTH-1, stdin);
    			buf[strlen(buf)-1]='\0';
    			int result = send(descbrCli,buf,BUF_LENGTH,0);
    			//test(result,"send");
    		}
    		if(FD_ISSET(descbrCli, &tab))
    		{
    		    printf("Reception!\n");
    			int recevoir = recv(descbrCli,buf,sizeof(buf),0);
    			if(!recevoir)
    			{
                                      closesocket(descbrCli);
                                      printf("déconnexion du serveur.\n");
                                      exit(EXIT_FAILURE);
    			}
    			//test(recevoir,"recv");
    			printf("quelqu'un a dit: [%s].\n" , buf);
    		}
     
    	}
            WSACleanup();
    	closesocket(descbrCli);
    	return 0;
    }
    J'ai vraiment besoin d'aide j'ai passé toute la nuit dessus et la journée d'hier.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je ne trouve rien de flagrant, mais il semble manquer IPPROTO_TCP dans la création du socket d'écoute...

    Edit: De plus, il manque une comparaison à INVALID_SOCKET dans test(descbr,"ouverture socket publique");
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Je ne trouve rien de flagrant, mais il semble manquer IPPROTO_TCP dans la création du socket d'écoute...
    En passant 0 le système essayera de choisir automatiquement la meilleure option selon les 2 premières


    Je suis pas grand utilisateur de select mais le premier paramètre ne sert à rien et est généralement mis à 0, j'y préfère le simple mode non-bloquant donc je saurais dire où ça pêche (+ wall of code & lisibilité pas ouf j'ai la flegme de lire désolé) mais en théorie les seules différences entre Linux et Windows sont
    - l'initialisation de la lib socket (WSAStartup) et sa désinitialisation à la fin
    - le closesocket
    - le set du mode non-bloquant
    - les define d'erreur

    voilà un exemple bien fait et compréhensible
    http://www.winsocketdotnetworkprogra...omethod5a.html
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

Discussions similaires

  1. Problème portage code Linux vers Windows
    Par scary dans le forum Windows
    Réponses: 14
    Dernier message: 11/01/2010, 17h56
  2. problème portage ioctl socket Linux vers Windows
    Par progfou dans le forum Réseau
    Réponses: 19
    Dernier message: 06/10/2009, 19h44
  3. Programmation de socket linux sous windows
    Par neuro6 dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 16/10/2007, 18h35
  4. Portage application linux sur windows : pb flex/bison
    Par bludo31 dans le forum Windows
    Réponses: 1
    Dernier message: 01/10/2006, 16h07
  5. [debutant] portage de linux a windows
    Par Lnmex dans le forum Autres éditeurs
    Réponses: 6
    Dernier message: 26/04/2006, 10h29

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