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 :

Problème de connexion sockets Windows


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2020
    Messages : 4
    Par défaut Problème de connexion sockets Windows
    Bonjour a tous!

    J'ai un petit souci avec mes sockets Windows. Lorsque j'ouvre mes ports orange, que je mets les bonnes IP (ip du pc sur le serveur et ip publique sur le client), que je lance le serveur et que je me connecte avec le client, le client reçoit bien un message ("quel est votre nom et votre age"), mais le serveur quant à lui, ne reçoit aucune donnée de la part du client (mais m'affiche bien que le client s'est connecté). J'ai essayé le même programme avec l'ipv4 de mon pc sur les deux .c et testé avec mon ordi et un autre (sur la même co) et ça fonctionne très bien. (Et sans l'autorisation du port, le client ne se connecte pas du tout donc ça m'étonnerait que le problème vienne de l'ouverture de port). J'ai aussi essayé de désactiver intégralement mon antivirus et désactiver les pare-feu orange (choisir le niveau de sécurité: faible) sans succès.

    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
     
    //serveur
    #include<windows.h>
    #include<unistd.h>
    #include <winsock2.h>
    #include <ws2tcpip.h>
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include <pthread.h>
     
     
    typedef struct User
    {
        char nom[30];
        int age;
    }User;
     
    void *function(void *arg)
    {
        int socket = *(int*)arg;
        char msg[] = "quel est votre nom et votre age";
        User user;
        send(socket, msg, strlen(msg)+1, 0);
        recv(socket, &user, sizeof(user), 0);
        printf("le client s'appelle %s et a %d ans\n", user.nom, user.age);
        close(socket);
        free(arg);
        pthread_exit(NULL);
    }
     
    int main(void)
    {
        setbuf(stdout, NULL);
        setbuf(stderr, NULL);
     
        WSADATA WSAData;
        if(WSAStartup(MAKEWORD(2, 0), &WSAData))
        {
           printf("WSA n'a pas pu être initialisé.\n");
        }
     
        int socketServer = socket(AF_INET, SOCK_STREAM, 0);
        struct sockaddr_in addrServer;
        memset(&addrServer, 0, sizeof (addrServer));
        addrServer.sin_addr.s_addr = inet_addr("192.168.1.38");
        addrServer.sin_family = AF_INET;
        addrServer.sin_port = htons(30000);
     
        bind(socketServer, (const struct sockaddr *)&addrServer, sizeof(addrServer));
        printf("bind: %d\n", socketServer);
     
        listen(socketServer,4);
        printf("listen\n");
     
        pthread_t threads[4];
     
        for(int i=0; i<4; i++)
        {
            struct sockaddr_in addrClient;
            socklen_t csize = sizeof(addrClient);
            int socketClient = accept(socketServer, (struct sockaddr *)&addrClient, &csize);
            printf("accept\n");
            printf("client: %d\n", socketClient);
     
            int *arg = malloc(sizeof(int));
            *arg = socketClient;
            pthread_create(&threads[i], NULL, function, arg);
        }
     
     
        for(int i=0; i<4; i++)
        {
            pthread_join(threads[i], NULL);
        }
     
     
        close(socketServer);
        printf("Close\n");
     
        WSACleanup();
        return 0;
    }
    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
     
    //client
    #include<windows.h>
    #include<unistd.h>
    #include <winsock2.h>
    #include <ws2tcpip.h>
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include <pthread.h>
     
    typedef struct User
    {
        char nom[30];
        int age;
    } User;
     
    int main(void)
    {
        setbuf(stdout, NULL);
        setbuf(stderr, NULL);
     
        WSADATA WSAData;
        if(WSAStartup(MAKEWORD(2, 0), &WSAData))
        {
            printf("WSA n'a pas pu être initialisé.\n");
        }
     
        int socketClient = socket(AF_INET, SOCK_STREAM, 0);
        struct sockaddr_in addrClient;
        memset(&addrClient, 0, sizeof (addrClient));
        addrClient.sin_addr.s_addr = inet_addr("90.70.0.168");
        addrClient.sin_family = AF_INET;
        addrClient.sin_port = htons(30000);
        connect(socketClient, (const struct sockaddr *)&addrClient, sizeof(addrClient));
        printf("connecte\n");
     
     
        /******action*******/
        User user;
        char msg[33];
        recv(socketClient, msg, 32, 0);
        printf("%s\n", msg);
        scanf("%s %d", user.nom, &user.age);
        send(socketClient, (void *)&user, sizeof(user), 0);
        /***************/
     
     
     
        close(socketClient);
     
        WSACleanup();
        return 0;
    }
    Quelqu'un pourrait-il m'expliquer pourquoi ça ne fonctionne pas?

    Merci à tous!

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Olocki Voir le message
    Quelqu'un pourrait-il m'expliquer pourquoi ça ne fonctionne pas?
    Je n'en ai aucune idée. Toutefois moi si j'étais confronté à ce souci, je regarderais ce que renvoient send() et recv() et éventuellement strerror(errno) (sans oublier les autres fonctions critiques comme connect() ou bind). C'est ce qu'on faisait avant qu'il y ait des forums, et donc ce n'est pas parce qu'il y a des forums qu'il faut oublier les fondamentaux...

    Citation Envoyé par Olocki Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int *arg = malloc(sizeof(int));
    *arg = socketClient;
    pthread_create(&threads[i], NULL, function, arg);
    ??????

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    pthread_create(&threads[i], NULL, function, &socketClient);
    Et bien évidemment tu supprimes le free dans la fonction.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Y'a tellement d'erreurs que c'est pas évident de tout faire tenir en un post...
    Déjà tu oublies 99% des vérifications d'erreurs.
    send n'est pas vraiment bloquant.
    recv est bloquant mais c'est plus subtil.
    accept est bloquant.
    connect est bloquant.

    Maintenant qu'on a lu les bases niveau 0 de l'API socket, que voit-on dans ton code ?
    - le serveur bind une interface spécifique et non ADDR_ANY, sûrement sans raison autre que de vouloir laisser un rateau et marcher dessus à l'occasion
    - le serveur va faire 4 boucles pour récupérer 4 clients
    - pour chaque client il lance un thread
    - pour une raison injustifiable l'argument du thread est alloué dynamiquement
    - le thread du client envoie quelque chose, puis attend de recevoir quelque chose
    > tu as de la chance que le recv bloquera assez pour que l'envoi soit fait
    - dès qu'un truc est reçu, il ferme la socket
    - et tu mets fin au thread qui se terminera de toute façon puisqu'on est à la fin de la fonction

    Quant au client
    - il se connecte
    - on prie pour que ça fonctionne
    - il reçoit des trucs
    > on a aucune idée de ce qu'il recevra réellement, mais mettons que la chance est avec nous et on reçoit bien la chaîne entière
    - il envoie un truc
    - puis il se termine
    > autant dire qu'il a extrêmement peu de chance, voire aucune, que ce qu'il espère envoyer arrive à destination
    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.

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2020
    Messages : 4
    Par défaut
    Merci beaucoup pour vos réponses !
    Je suis sincèrement désolé de vous avoir autant frustré par mon code terriblement mauvais et je m'en excuse
    Je viens tout juste de commencer à apprendre le réseau (d'où le niveau 0 )
    J'ai revu mon code et essayé d’intégrer un maximum de vérif. (j’espère que c'est bon)

    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
     
    //serveur
    #include<windows.h>
    #include<unistd.h>
    #include <winsock2.h>
    #include <ws2tcpip.h>
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include <pthread.h>
     
     
    typedef struct User
    {
        char nom[30];
        int age;
    }User;
     
    void *function(void *arg)
    {
        int sock_err;
        int socket = *(int*)arg;
        char msg[] = "quel est votre nom et votre age";
        User user;
        sock_err = send(socket, msg, strlen(msg)+1, 0);
     
        if(sock_err != SOCKET_ERROR)
            printf("Chaine envoyée : %s\n", msg);
        else
            printf("Erreur de transmission\n");
     
        if(recv(socket, (void *)&user, sizeof(user), 0) != SOCKET_ERROR)
        {
            printf("Message recu\n");
            printf("le client s'appelle %s et a %d ans\n", user.nom, user.age);
        }
        else
            printf("Erreur : aucun message recu\n");
     
        printf("Fermeture de la socket client\n");
        close(socket);
        pthread_exit(NULL);
        return NULL;
    }
     
    int main(void)
    {
        setbuf(stdout, NULL);
        setbuf(stderr, NULL);
     
        WSADATA WSAData;
        if(WSAStartup(MAKEWORD(2, 0), &WSAData))
        {
           printf("WSA n'a pas pu être initialisé.\n");
        }
     
        int sock_err;
        int socketServer = socket(AF_INET, SOCK_STREAM, 0);
     
        if(socketServer != INVALID_SOCKET)
        {
            struct sockaddr_in addrServer;
            memset(&addrServer, 0, sizeof (addrServer));
            addrServer.sin_addr.s_addr = inet_addr("192.168.1.38");
            addrServer.sin_family = AF_INET;
            addrServer.sin_port = htons(30000);
     
            sock_err = bind(socketServer, (const struct sockaddr *)&addrServer, sizeof(addrServer));
     
            if(sock_err != SOCKET_ERROR)
            {
                printf("bind: %d\n", socketServer);
                sock_err = listen(socketServer,4);
     
                if(sock_err != SOCKET_ERROR)
                {
                    printf("listen\n");
     
                    pthread_t threads[4];
     
                    for(int i=0; i<4; i++)
                    {
                        struct sockaddr_in addrClient;
                        socklen_t csize = sizeof(addrClient);
                        int socketClient = accept(socketServer, (struct sockaddr *)&addrClient, &csize);
                        printf("accept\n");
                        printf("client: %d\n", socketClient);
     
                        pthread_create(&threads[i], NULL, function, &socketClient);
                    }
     
     
                    for(int i=0; i<4; i++)
                        pthread_join(threads[i], NULL);
                }
                else
                    perror("listen");
            }
            else
                perror("bind");
     
            printf("Fermeture de la socket serveur\n");
            close(socketServer);
        }
        else
            perror("socket");
     
        printf("Fermeture serveur\n");
     
        WSACleanup();
        return 0;
    }
    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
     
    //client
    #include<windows.h>
    #include<unistd.h>
    #include <winsock2.h>
    #include <ws2tcpip.h>
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include <pthread.h>
     
    typedef struct User
    {
        char nom[30];
        int age;
    } User;
     
    int main(void)
    {
        setbuf(stdout, NULL);
        setbuf(stderr, NULL);
     
        WSADATA WSAData;
        if(WSAStartup(MAKEWORD(2, 0), &WSAData))
        {
            printf("WSA n'a pas pu être initialisé.\n");
        }
     
        User user;
        char msg[33];
     
        int socketClient = socket(AF_INET, SOCK_STREAM, 0);
     
        struct sockaddr_in addrClient;
        memset(&addrClient, 0, sizeof (addrClient));
        addrClient.sin_addr.s_addr = inet_addr("90.70.0.168");
        addrClient.sin_family = AF_INET;
        addrClient.sin_port = htons(30000);
     
        if(connect(socketClient, (const struct sockaddr *)&addrClient, sizeof(addrClient)) != SOCKET_ERROR)
        {
            printf("Connexion à %s sur le port %d\n", inet_ntoa(addrClient.sin_addr), htons(addrClient.sin_port));
            if(recv(socketClient, msg, 32, 0) != SOCKET_ERROR)
                printf("%s\n", msg);
            else
                printf("Message non reçu");
     
            scanf("%s %d", user.nom, &user.age);
     
            if(send(socketClient, (void *)&user, sizeof(user), 0) != SOCKET_ERROR)
                printf("Message envoye\n");
            else
                printf("Erreur de transmission\n");
        }
        else
            printf("ERREUR DE CONNEXION\n");
     
     
        /***************/
        system("pause");
        printf("Fermeture de du client");
        close(socketClient);
        WSACleanup();
     
        return 0;
    }
    Mon code est-il plus convenable?

    Et maintenant le serveur m'affiche "Erreur : aucun message reçu" (le 2eme else dans le thread)

    Merci encore pour tous vos conseils.

  5. #5
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    C'est mieux et tu peux déjà le constater : tu as une erreur bien visible qui apparaît.
    Maintenant le pourquoi de l'erreur est aussi dans mon message précédent. Non le serveur ne recevra presque jamais rien puisque le client se termine avant d'avoir envoyé réellement.

    https://bousk.developpez.com/cours/r...-protocole/#LI
    l'appel à recv permet de récupérer jusque len octets de données.
    Je ne vais pas recopier ici des chapitres de mon cours, tu peux cliquer sur le lien dans ma signature et le lire.
    Les données ne sont envoyées que si le client reste connecté suffisamment longtemps pour que l'envoi soit effectif.
    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.

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Olocki Voir le message
    Mon code est-il plus convenable?
    C'est pas pour nous, c'est pour toi. Quand on fait une action critique, on la vérifie. Ca permet de "vérifier" que l'action a fonctionné (évidemment c'est con comme la lune ce genre d'évidence mais c'est quand elle n'y est pas qu'on regrette).
    Ceci dit, au lieu de tester la réussite, perso je préfère teste l'échec. Ca me permet quand j'arrive au code utile de de continuer à l'écrire à gauche et donc d'avoir beaucoup de place.
    Donc au lieu de faire
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    if (truc1 == ok) {
    	if (truc2 == ok) {
    		if (truc3 == ok) {
    			// ici on commence à coder utile, mais il n'y a plus de place !!!
    		}else {
    			perror("truc3");
    		}
    	} else {
    		perror("truc2");
    	}
    } else {
    	perror("truc1");
    }

    Déjà imagine dans ton code que tu doives rajouter un test sur truc0 avant truc1... obligé de tout décaler. Donc je préfère écrire
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    if (truc1 != ok) {
    	perror("truc1");
    	sortie de la boucle , de la fonction
    }
    if (truc2 != ok) {
    	perror("truc2");
    	sortie de la boucle , de la fonction
    }
    if (truc3 != ok) {
    	perror("truc3");
    	sortie de la boucle , de la fonction
    }
    // Code utile - Ok, j'ai toute la place
    Je veux rajouter un test "truc0", ben je rajoute juste 3 lignes avant truc1.
    Autre chose, il n'y a pas de constante "SOCKET_ERROR" et tout ça. Une fonction standard réussit elle renvoie 0 ou un nombre positif (si en plus elle veut dire de combien elle réussit), elle ne réussit pas elle renvoie -1. Donc on cherche l'échec on cherche "-1".
    Il peut y avoir 0 qui a un statut un peu batard car lui il signifie "l'opération n'a pas planté, mais elle n'a rien fait car il n'y avait rien à faire".
    Et en plus le résultat de l'opération, si l'opération réussit, est souvent une information utile (nb d'octets envoyés, reçus, etc). Donc la variable qui récupère ce résultat ne doit pas se nommer "err". Même si on teste l'échec, on s'attend à une réussite.

    Citation Envoyé par Olocki Voir le message
    Et maintenant le serveur m'affiche "Erreur : aucun message reçu" (le 2eme else dans le thread)
    Hé ben chez-moi, ton code fonctionne !!! Hé oui !!! Bon ça ne veut pas dire qu'il est parfait, mais au-moins les sockets communiquent.

    Bon toutefois n'étant pas sous Windows, j'ai enlevé tout ce qui fait référence à cet OS (déjà les WSA, et les thread). J'ai donc repris ton code à l'identique, mais adapté à Linux

    Le serveur
    Code c : 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
    //serveur
    #include <sys/types.h>						// Types prédéfinis "c"
    #include <sys/socket.h>						// Généralités sockets
    #include <sys/param.h>						// Paramètres et limites système
    #include <netinet/in.h>						// Spécifications socket internet
    #include <arpa/inet.h>						// Adresses format "arpanet"
    #include<unistd.h>
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<pthread.h>
     
    typedef struct User
    {
        char nom[30];
        int age;
    }User;
     
    void *function(void *arg)
    {
        int sock_err;
        int socket = *(int*)arg;
        char msg[] = "quel est votre nom et votre age";
        User user;
        sock_err = send(socket, msg, strlen(msg)+1, 0);
     
        if(sock_err > 0)
            printf("Chaine envoyée : %s\n", msg);
        else
            printf("Erreur de transmission\n");
     
        if(recv(socket, (void *)&user, sizeof(user), 0) > 0)
        {
            printf("Message recu\n");
            printf("le client s'appelle %s et a %d ans\n", user.nom, user.age);
        }
        else
            printf("Erreur : aucun message recu\n");
     
        printf("Fermeture de la socket client\n");
        close(socket);
        pthread_exit(NULL);
        return NULL;
    }
     
    int main(void)
    {
        setbuf(stdout, NULL);
        setbuf(stderr, NULL);
     
        int sock_err;
        int socketServer = socket(AF_INET, SOCK_STREAM, 0);
     
        if(socketServer != -1)
    	{
            struct sockaddr_in addrServer;
            memset(&addrServer, 0, sizeof (addrServer));
            addrServer.sin_addr.s_addr = INADDR_ANY;
            addrServer.sin_family = AF_INET;
            addrServer.sin_port = htons(30000);
     
            sock_err = bind(socketServer, (const struct sockaddr *)&addrServer, sizeof(addrServer));
     
            if(sock_err != -1)
            {
                printf("bind: %d\n", socketServer);
                sock_err = listen(socketServer,1);
     
                if(sock_err != -1)
                {
                    printf("listen\n");
     
                    struct sockaddr_in addrClient;
                    socklen_t csize = sizeof(addrClient);
                    int socketClient = accept(socketServer, (struct sockaddr *)&addrClient, &csize);
                    printf("accept\n");
                    printf("client: %d\n", socketClient);
    				function(&socketClient);
                }
                else
                    perror("listen");
            }
            else
                perror("bind");
     
            printf("Fermeture de la socket serveur\n");
            close(socketServer);
        }
        else
            perror("socket");
     
        printf("Fermeture serveur\n");
     
        return 0;
    }

    Le client
    Code c : 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
    //client
    #include <sys/types.h>						// Types prédéfinis "c"
    #include <sys/socket.h>						// Généralités sockets
    #include <sys/param.h>						// Paramètres et limites système
    #include <netinet/in.h>						// Spécifications socket internet
    #include <arpa/inet.h>						// Adresses format "arpanet"
    #include<unistd.h>
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
     
     
    typedef struct User
    {
        char nom[30];
        int age;
    } User;
     
    int main(void)
    {
        setbuf(stdout, NULL);
        setbuf(stderr, NULL);
     
        User user;
        char msg[33];
     
        int socketClient = socket(AF_INET, SOCK_STREAM, 0);
     
        struct sockaddr_in addrClient;
        memset(&addrClient, 0, sizeof (addrClient));
        addrClient.sin_addr.s_addr = inet_addr("127.0.0.1");
        addrClient.sin_family = AF_INET;
        addrClient.sin_port = htons(30000);
     
        if(connect(socketClient, (const struct sockaddr *)&addrClient, sizeof(addrClient)) != -1)
        {
            printf("Connexion à %s sur le port %d\n", inet_ntoa(addrClient.sin_addr), htons(addrClient.sin_port));
            if(recv(socketClient, msg, 32, 0) > 0)
                printf("%s\n", msg);
            else
                printf("Message non reçu");
     
            scanf("%s %d", user.nom, &user.age);
     
            if(send(socketClient, (void *)&user, sizeof(user), 0) > 0)
                printf("Message envoye\n");
            else
                printf("Erreur de transmission\n");
        }
        else
            printf("ERREUR DE CONNEXION\n");
     
     
        /***************/
        system("pause");
        printf("Fermeture de du client");
        close(socketClient);
     
        return 0;
    }

    Tu remarqueras que pour le serveur j'utilise l'adresse INADDR_ANY dont avait parlé Bousk.

    Donc ce code fonctionne, donc peut-être le souci vient soit des WSA, soit des thread.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Autre chose, il n'y a pas de constante "SOCKET_ERROR" et tout ça. Une fonction standard réussit elle renvoie 0 ou un nombre positif (si en plus elle veut dire de combien elle réussit), elle ne réussit pas elle renvoie -1. Donc on cherche l'échec on cherche "-1".
    Sur Windows l'API socket retourne SOCKET_ERROR en cas d'erreur. C'est un define à -1.

    Citation Envoyé par Sve@r Voir le message
    Hé ben chez-moi, ton code fonctionne !!! Hé oui !!! Bon ça ne veut pas dire qu'il est parfait, mais au-moins les sockets communiquent.
    Il fonctionne grâce à la pause que tu as ajouté à la fin. Pause pendant laquelle les données ont le temps de transiter.

    C'est très simple : allume un tuyau d'eau, puis éteins le directement. Tu vas jamais arroser quoi que ce soit de cette façon.
    Le bug ce n'est pas le tuyau ou le robinet, c'est que l'eau n'a jamais le temps de sortir du tuyau.
    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 de connexion Socket en TCP
    Par jerdream78 dans le forum Réseau
    Réponses: 11
    Dernier message: 26/02/2010, 12h05
  2. problème de connexion :socket
    Par alamidev dans le forum C#
    Réponses: 0
    Dernier message: 29/04/2009, 13h23
  3. Problème de connexion sous Windows Server 2003 SP2
    Par SebLeRouennais dans le forum JDBC
    Réponses: 0
    Dernier message: 07/01/2009, 15h42
  4. Problème de connexion sous windows 98
    Par aiolia_aiolos dans le forum Débuter
    Réponses: 5
    Dernier message: 21/10/2008, 14h59
  5. Problème de connexion socket
    Par stephane.julien dans le forum C#
    Réponses: 3
    Dernier message: 24/04/2008, 18h28

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