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 :

Socket dans une thread


Sujet :

C

  1. #1
    Membre à l'essai Avatar de beau_g
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2017
    Messages : 26
    Points : 24
    Points
    24
    Par défaut Socket dans une thread
    Bonjour a tous,

    Dans le cadre d'un projet et etant debutant en C, je viens à vous pour un petit coup de pouce.
    Je cherche à envoyer une message vers un serveur à l'aide d'une socket; et en utilisant les threads.

    J'ai donc créer la fonction suivante qui me permet normalement d'envoyer un message de type char à une addresse et à un port donnés en unicast

    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
     
    #include "unicast_socket_sendto.h"
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/time.h> /* gettimeofday */
     
    void unicast_socket_sendto(int *sockfd, int* port, char* address, char* data) {
     
    	    struct hostent *he; /* server address info */
    	    struct sockaddr_in their_addr;
    	    int bytesReceived;
    	    socklen_t addr_len = (socklen_t)sizeof (their_addr);
    	    int sock = *sockfd;
     
     
    	    /* resolve server host name or IP address */
    	    if ((he = gethostbyname(address)) == NULL) {
    	    	perror("Server gethostbyname");
    	    	exit(1);
    	    }
     
    	    printf("Setting up socket Port %d: ", *port);
    	    /* Setup the socket */
    	    if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
    	        perror("Talker socket");
    	        exit(1);
    	    }
    	    printf("OK\n");
     
     
    	    memset(&their_addr, 0, sizeof (their_addr)); /* zero struct */
    	    /* Server details */
    	    their_addr.sin_family = AF_INET; /* host byte order .. */
    	    their_addr.sin_port = htons(*port); /* .. short, netwk byte order */
    	    their_addr.sin_addr = *((struct in_addr *) he->h_addr);
     
     
           /* Sends the data to the server. */
           if ((bytesReceived = sendto(sock, &data, sizeof (data), 0,
                (struct sockaddr *)&their_addr, addr_len)) == -1) {
            perror("Server Send Error");
            exit(1);
            }
     
    }
    Je souhaite maintenant inserer cette fonction dans un thread qui me permettra d'envoyer cette d'envoyer un message pendant un certains temps; jusqu'a l'envoie du message complet par exemple; j'ai donc essayé d'écrire un code qui ressemble a ca:

    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
    #include "thread.h"
    #include "unicast_socket_sendto.h"
     
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <string.h>
    #include <pthread.h>
     
    #define  UNI_ADDR      "2.5.6.7"       /* Arg: IP Uni Address */
    #define  UNI_PORT        1234       /* Arg: Server port */
    #define  MESSAGE        "Hello"
     
    /* this function is run by the second thread */
    void *send_unicast(void *void_msg)
    {
    	/* increment x to 100*/
    	char msg = (char *)void_msg;
    	int sockfd;
     
    	char uni_add = UNI_ADDR;
    	int uni_port = UNI_PORT;
     
    	while (1) {
    		unicast_socket_sendto(sockfd, &uni_port, &uni_add, &msg);
    	    }
     
    	printf("sending finished\n");
    	close(sockfd);
    	/* the function must return something - NULL will do */
    	return NULL;
    }
     
    int main()
    {
    	char msg = MESSAGE;
     
    	/* this variable is our reference to the second thread */
     
    	pthread_t inc_x_thread;
     
    	/* create a second thread which executes send_unicast(&msg) */
     
    	if(pthread_create(&inc_x_thread, NULL, send_unicast, &msg)) {
    		fprintf(stderr, "Error creating thread\n");
    		return 1;
     
    	}
     
    	return 0;
     
    }
    Mais il y a beaucoup d'erreurs ; qui se ressemblent plus ou moins; et j'ai beaucoup de mal à les corriger.

    Pouvez vous m'expliquer l'origine de ses erreurs et m'aider si possible à les supprimer.

    De plus, mon utilisation des threads n'etant pas encore au point; j'aurai besoin de petits conseils pour les utiliser dans ce contexte ; il doit me manquer quelques elements importants

    13:19:37 **** Incremental Build of configuration Debug for project test2 ****
    Info: Internal Builder is used for build
    gcc -O0 -g3 -Wall -c -fmessage-length=0 -o thread.o "..\\thread.c"
    In file included from c:\mingw\include\windows.h:42:0,
    from c:\mingw\include\winsock2.h:22,
    from c:\mingw\include\ws2tcpip.h:19,
    from ..\unicast_socket_sendto.h:14,
    from ..\thread.c:9:
    c:\mingw\include\windef.h:66:9: erreur: les noms de macro doivent être des identificateurs
    #define '\0' ((void*)0)
    ^
    ..\thread.c: Dans la fonction 'send_unicast':
    ..\thread.c:25:13: attention : initialization makes integer from pointer without a cast [-Wint-conversion]
    char msg = (char *)void_msg;
    ^
    ..\thread.c:17:22: attention : initialization makes integer from pointer without a cast [-Wint-conversion]
    #define UNI_ADDR "2.5.6.7" /* Arg: IP Uni Address */
    ^
    ..\thread.c:28:17: note: in expansion of macro 'UNI_ADDR'
    char uni_add = UNI_ADDR;
    ^
    ..\thread.c:32:33: attention : passing argument 2 of 'unicast_socket_sendto' makes integer from pointer without a cast [-Wint-conversion]
    unicast_socket_sendto(sockfd, &uni_port, &uni_add, &msg);
    ^
    In file included from ..\thread.c:9:0:
    ..\unicast_socket_sendto.h:30:6: note: expected 'int' but argument is of type 'int *'
    void unicast_socket_sendto(int sockfd, int port, char address, char data);
    ^
    ..\thread.c:32:44: attention : passing argument 3 of 'unicast_socket_sendto' makes integer from pointer without a cast [-Wint-conversion]
    unicast_socket_sendto(sockfd, &uni_port, &uni_add, &msg);
    ^
    In file included from ..\thread.c:9:0:
    ..\unicast_socket_sendto.h:30:6: note: expected 'char' but argument is of type 'char *'
    void unicast_socket_sendto(int sockfd, int port, char address, char data);
    ^
    ..\thread.c:32:54: attention : passing argument 4 of 'unicast_socket_sendto' makes integer from pointer without a cast [-Wint-conversion]
    unicast_socket_sendto(sockfd, &uni_port, &uni_add, &msg);
    ^
    In file included from ..\thread.c:9:0:
    ..\unicast_socket_sendto.h:30:6: note: expected 'char' but argument is of type 'char *'
    void unicast_socket_sendto(int sockfd, int port, char address, char data);
    ^
    ..\thread.c: Dans la fonction 'main':
    ..\thread.c:19:25: attention : initialization makes integer from pointer without a cast [-Wint-conversion]
    #define MESSAGE "Hello"
    ^
    ..\thread.c:43:13: note: in expansion of macro 'MESSAGE'
    char msg = MESSAGE;
    ^
    Merci d'avance pour vos reponse;
    Je suis ouvert à tte les critiques quelles qu'elles soient !

    Best regards,

    beau_g

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Le premier message est une violente erreur de compilation: un #define avec '\0' comme nom de macro.
    Fais voir tes en-têtes.

    Ce type d'erreur provoque souvent une cascade de problèmes.
    Par la suite, tu as des erreurs de conversion entre pointeurs et entiers, correspondant en général à du "j'ai codé à l'aveugle et je me suis loupé".
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Membre à l'essai Avatar de beau_g
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2017
    Messages : 26
    Points : 24
    Points
    24
    Par défaut
    Qu'est ce que tu veux dire par en-tête ?
    Oui je dois avouer que je suis pas tres fier de moi :/ il me manque pas mal de pratique en codage

  4. #4
    Membre à l'essai Avatar de beau_g
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2017
    Messages : 26
    Points : 24
    Points
    24
    Par défaut
    J'ai resolu quelques erreurs avec quelques modifications, mais il me reste toujours la 1ere :

    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
    /*
     * thread.c
     *
     *  Created on: 21 juil. 2017
     *      Author: begau
     */
     
    #include "thread.h"
    #include "unicast_socket_sendto.h"
     
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <string.h>
    #include <pthread.h>
     
     
    /* this function is run by the second thread */
    void *send_unicast(void *x_void_ptr)
    {
    	/* increment x to 100 */
    	int *x_ptr = (int *)x_void_ptr;
     
    	int sockfd;
    	char addr_uni = "2.5.6.7";
    	int uni_port = 1234;
    	char message = "Hello";
     
    	while(++(*x_ptr) < 100);
    	while (1) {
    		unicast_socket_sendto(sockfd, uni_port, addr_uni, message);
    	    }
     
    	printf("sending finished\n");
    	close(sockfd);
    	/* the function must return something - NULL will do */
    	return NULL;
    }
     
    int main()
    {
    	int x = 0;
     
    	/* this variable is our reference to the second thread */
     
    	pthread_t inc_x_thread;
     
    	/* create a second thread which executes send_unicast(&msg) */
     
    	if(pthread_create(&inc_x_thread, NULL, send_unicast, &x)) {
    		fprintf(stderr, "Error creating thread\n");
    		return 1;
     
    	}
     
    	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
    #include "unicast_socket_sendto.h"
     
     
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/time.h> /* gettimeofday */
    #include "app_config.h"
     
     
     
    void unicast_socket_sendto(int sockfd, int port, char address, char data) {
     
    	    struct hostent *he; /* server address info */
    	    struct sockaddr_in their_addr;
    	    int bytesReceived;
    	    socklen_t addr_len = (socklen_t)sizeof (their_addr);
    	    int sock = sockfd;
    	    int uni_port = port;
     
    	    /* resolve server host name or IP address */
    	    if ((he = gethostbyname(&address)) == NULL) {
    	    	perror("Server gethostbyname");
    	    	exit(1);
    	    }
     
    	    printf("Setting up socket Port %d: ", uni_port);
    	    /* Setup the socket */
    	    if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
    	        perror("Talker socket");
    	        exit(1);
    	    }
    	    printf("OK\n");
     
     
    	    memset(&their_addr, 0, sizeof (their_addr)); /* zero struct */
    	    /* Server details */
    	    their_addr.sin_family = AF_INET; /* host byte order .. */
    	    their_addr.sin_port = htons(uni_port); /* .. short, netwk byte order */
    	    their_addr.sin_addr = *((struct in_addr *) he->h_addr);
     
     
           /* Sends the data to the server. */
           if ((bytesReceived = sendto(sock, &data, sizeof (data), 0,
                (struct sockaddr *)&their_addr, addr_len)) == -1) {
            perror("Server Send Error");
            exit(1);
            }
     
    }
    ERREUR:
    15:51:21 **** Incremental Build of configuration Debug for project test2 ****
    Info: Internal Builder is used for build
    gcc -O0 -g3 -Wall -c -fmessage-length=0 -o thread.o "..\\thread.c"
    In file included from c:\mingw\include\windows.h:42:0,
    from c:\mingw\include\winsock2.h:22,
    from c:\mingw\include\ws2tcpip.h:19,
    from ..\unicast_socket_sendto.h:14,
    from ..\thread.c:9:
    c:\mingw\include\windef.h:66:9: erreur: les noms de macro doivent être des identificateurs
    #define '\0' ((void*)0)
    ^
    ..\thread.c: Dans la fonction 'send_unicast':
    ..\thread.c:25:18: attention : initialization makes integer from pointer without a cast [-Wint-conversion]
    char addr_uni = "2.5.6.7";
    ^
    ..\thread.c:27:17: attention : initialization makes integer from pointer without a cast [-Wint-conversion]
    char message = "Hello";
    ^

    15:51:21 Build Finished (took 343ms)

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    tes fichiers .h
    h est une extension de nom de fichier, choisie pour le mot header ou en-tête en français.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  6. #6
    Membre à l'essai Avatar de beau_g
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2017
    Messages : 26
    Points : 24
    Points
    24
    Par défaut
    Ils sont deja affiché il me semble non ?

  7. #7
    Membre expérimenté

    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2009
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 553
    Points : 1 672
    Points
    1 672
    Par défaut
    Prends deux minutes pour réfléchir:

    1er indice: ternel t'as signalé que "Le premier message est une violente erreur de compilation: un #define avec '\0' comme nom de macro."

    2ème indice: le message en question t'indique qu'il y un problème dont tu peux remonter la source
    - c'est a planté la compilation de ton "thread.c" à a ligne 9
    - la cause du plantage vient du contenu de ton "unicast_socket_sendto.h", à la ligne 14
    - probablement qu'à la ligne 14 de "unicast_socket_sendto.h", tu fais un #include <ws2tcpip.h>
    - en réalité le problème s'est manifesté à la ligne 19 de "ws2tcpip.h"
    - etc...

    Déduction:
    Comme il peu probable que les fichiers ".h" dans c:\mingw\include\" soient mauvais, on peut en déduire que tu fais quelque chose de mal dans ton "unicast_socket_sendto.h"

    Et, non, tu ne nous a pas donné le contenu de tes fichiers ".h". Donc il va falloir nous les montrer.

  8. #8
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Salut c'est normal qu'il y ait des erreurs de compilations car parmi les #define il y a des chaines de caractères ( en C/C++ effectivement une chaine de caractères se termine par le code d'échappement \0)
    Donc le mieux c'est de définir par exemple char msg[]="Hello".


    Citation Envoyé par beau_g Voir le message
    Mais il y a beaucoup d'erreurs ; qui se ressemblent plus ou moins; et j'ai beaucoup de mal à les corriger.
    Pouvez vous m'expliquer l'origine de ses erreurs et m'aider si possible à les supprimer.
    il faudrait revoir le cours du langage C
    En langage C une chaine de caractère c'est un tableau de caractères.

    Déclarer char msg="Hello" c'est déclarer un tableau avec un seul élément au lieu de 5 éléments pour contenir Hello ( plus un 6ième élément pour contenir \0).
    C'est pour ça qu'il y a des erreurs à la compilation
    Pour ne pas se casser la tête le mieux c'est de déclarer un tableau de 50-100 caractères et de définir la chaine de caractères avec strcpy
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char message[50];
    //....
    strcpy(message,"Hello");
    //...
    A condition d'avoir une chaine de caractère de longueur inférieure à 50

    Note: avec Visual Studio il y aura un avertissement qu'il faut utiliser strcpy_s à la place de strcpy

  9. #9
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Non, dans un define, il n'y a pas de chaine de caractères. Il y a un morceau de texte non encore lu comme du C++. #define est lue par le préprocesseur, avant la compilation.

    Par contre, il est possible que le nom de la macro soit déjà défini.
    Comme la définition est #define '\0' ((void*)0), j'imagine que c'est la définition d'un NULL quelconque.
    je parie que la définition écrite est #define NULL_CHAR NULL, alors que NULL_CHAR est déjà défini (à '\0')
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  10. #10
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par ternel Voir le message
    Non, dans un define, il n'y a pas de chaine de caractères. Il y a un morceau de texte non encore lu comme du C++. #define est lue par le préprocesseur, avant la compilation.
    ça passe pas sous Visual Studio 2012...
    de toute façon c'est aller chercher vraiment midi à 14heures
    ll faut faire comme j'ai écris ça fonctionne très bien.

    Nom : test_define_vs2012.jpg
Affichages : 219
Taille : 80,6 Ko

  11. #11
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Ca, c'est plutot parce que message est le nom d'une macro-fonction.
    Essaye avec MESSAGE, ca ira beaucoup mieux.

    Ceci compile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include <iostream>
    #define message "macros are evil"
    int main() {
        std::cout << message << std::endl;
        return 0;
    }
    Ca prouve bien deux choses: on évite les macros quand on peut, et on choisit toujours des noms en majuscules, parce que c'est plus flagrant.

    Ta solution me semble tout à fait meilleure, je réagissais uniquement à ton affirmation concernant les chaines de caractères et les macros.

    Le problème est tout simple, le nom défini par #define est préprocessé avant la définition.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  12. #12
    Membre à l'essai Avatar de beau_g
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2017
    Messages : 26
    Points : 24
    Points
    24
    Par défaut
    Bonjour,

    Merci pour vos réponse ! j'ai finalement modifier ,on thread afin qu'il puisse envoyer la socket lorsque j'appuie sur la touche S. Comme ceci :

    thread.c
    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
     
    #include "thread.h"
    #include "unicast_socket_sendto.h"
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <string.h>
    #include <pthread.h>
     
    /* this function is run by the second thread */
    void *send_uni()
    {
    	while(1){
     
    		char c = getchar();
     
    		if ((c=='s')||(c==''S')) {
    			printf("Sending of message\n");
    			SOCKET unicast_socket_sendto();
    		}
     
    		else if ((c=='q')||(c==''Q')) {
    			printf("Cancel\n");
    			break;
    		}
    		else {
    			printf("Invalid key, tape 'S' to send a message, 'Q' to exit\n");
    		}
    	}
    	return NULL;
    }
     
    int main()
    {
     
    	/* this variable is our reference to the second thread */
     
    	pthread_t thread;
     
    	/* create a second thread which executes inc_x(&x) */
     
    	if(pthread_create(&thread, NULL, send_uni, NULL)) {
    		fprintf(stderr, "Error creating thread\n");
    		return 1;
    	}
     
    	/* wait for the second thread to finish */
    	if(pthread_join(thread, NULL)) {
     
    		fprintf(stderr, "Error joining thread\n");
    		return 2;
    	}
    	return 0;
    }
    thread.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
    /*
     * thread.h
     *
     *  Created on: 21 juil. 2017
     *      Author: begau
     */
     
    #ifndef THREAD_H_
    #define THREAD_H_
     
     
    void *send_uni();
     
    #endif /* THREAD_H_ */
    Eclipse ne me renvoie plus d'erreur; mais impossible d executer

    Voici également la classe unicast_socket_sendto.

    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
    #include "unicast_socket_sendto.h"
     
    #include <errno.h>  /* errno */
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/time.h>
     
    #define message "hello"
    #define dest_ip  "127.0.0.1" //host IP
    #define port 7
    /* gettimeofday */
     
     
     
    SOCKET unicast_socket_sendto() {
     
    	WSADATA wsad; //Structure required to activate sockets
    	struct sockaddr_in sDest; //Structure that stores the host IP address and the connection port
    	int socket_id; //the connection port // message to send
     //host IP
     
    	int iResult = 0;  // variable to perform tests
    	char msg_rcv[1024]; //message received
     
     
    	if (WSAStartup(2,&wsad) == 0)
    	{
    		printf("Sockets are now usable...\n");
    	}
    	else
    	{
    		printf("Error n°%d : Error during initialization...\n", errno);
    		//exit(errno);
    		return errno;
    	}
     
    	//Initialization of the UDP socket
    	socket_id = socket(AF_INET, SOCK_DGRAM,0);
    	if(socket_id != -1)
    	{
    		printf("Initialization of the UDP socket successful...\n");
    	}
    	else
    	{
    		printf("Erreur n%d : Unable to initialize socket...\n",errno);
    		//exit(errno);
    		return errno;
    	}
     
    	// initialization of the destination structure
    	sDest.sin_family = AF_INET;
    	sDest.sin_port = htons(port);
    	sDest.sin_addr.s_addr = inet_addr(dest_ip);
     
    	int sizeSdest = sizeof(sDest); //Size of the receiving structure
     
    	// Sending the message
    	printf("Sending of the socket ...\n");
    	iResult = sendto(socket_id,message,strlen(message)+1,0, (struct sockaddr *)&sDest, sizeof(sDest));
    	if (iResult != -1)
    	{
    		printf("Successful message sending...\n");
    	}
    	else
    	{
    		printf("Error n%d : Unable to send message ...\n",errno);
    		//exit(errno);
    		return errno;
    	}
     
    	// Receiving the message
    	iResult = recvfrom(socket_id,msg_rcv, sizeof(msg_rcv), 0, (struct sockaddr *)&sDest, &sizeSdest);
    	if (iResult != -1)
    	{
    		printf("successful message reception ...\n");
    	}
    	else
    	{
    		printf("Error n%d : Unable to send message ...\n",errno);
    		//exit(errno);
    		return errno;
    	}
    	// Display of the message without interference
    	printf("The message is : %s\n", msg_rcv);
     
    	//Closing the socket
    	if (closesocket(socket_id) == 0)
    	{
    		printf("Socket closing ...\n");
    	}
    	else
    	{
    		printf("Error closing the socket...\n");
    		//exit(errno);
    		return errno;
    	}
    	system("BREAK");
    	return EXIT_SUCCESS;
     
    }
    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
     
     
    #ifndef SOCKET_H
    #define	SOCKET_H
     
    #ifdef WIN32
    #undef SOCKET
    #undef socklen_t
    #include <ws2tcpip.h>
    #include <winsock2.h>
     
     
    #define EWOULDBLOCK WSAEWOULDBLOCK
    #define socklen_t int
    typedef unsigned int in_addr_t;
    #else
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <sys/un.h>
    #include <netinet/tcp.h>
    #include <arpa/inet.h>
    #include <netdb.h>
    #endif
     
    SOCKET unicast_socket_sendto();
     
    #endif	/* SOCKET_H */

  13. #13
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Mais… pourquoi faire des #undef sur des symboles venant d'autre includes?
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  14. #14
    Membre à l'essai Avatar de beau_g
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2017
    Messages : 26
    Points : 24
    Points
    24
    Par défaut
    Cela viens d'un ancien programme sur les sockets, aui ne marchait pas sans; je l'ai gardé sans trop savoir ce que c'était; je l'ai maintenant supprimé.

  15. #15
    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 vois un certain nombre de problèmes:
    • send_uni() n'est pas déclarée avec le bon prototype pour une fonction de thread.
    • La ligne 19 redéclare la fonction unicast_socket_sendto() au lieu de l'appeler.
    • send_uni() donnera un message "invalid key" pour le \n tapé après le S ou Q.
    • Pourquoi déclarer le retour de unicast_socket_sendto() comme étant de type SOCKET si c'est errno (ou EXIT_SUCCESS, qui ne fait pourtant pas partie du même espace de valeurs) que tu retournes?
    • Pourquoi mettre des points de suspension dans un message qui indique la fin (ou l'échec) d'une tâche?
    • Et pourquoi appeler cette fonction une "classe"?
    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.

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

Discussions similaires

  1. fermeture socket dans un thread
    Par adrien1 dans le forum Débuter
    Réponses: 0
    Dernier message: 20/04/2010, 14h45
  2. Probleme de socket dans un thread
    Par nikus dans le forum Threads & Processus
    Réponses: 4
    Dernier message: 25/06/2008, 03h27
  3. problème de socket dans une application win32
    Par deck_bsd dans le forum Windows
    Réponses: 5
    Dernier message: 20/01/2007, 18h32
  4. pb de socket dans une appli MFC
    Par Nelmo dans le forum MFC
    Réponses: 1
    Dernier message: 04/06/2006, 19h02
  5. [MFC] CArchive dans une thread
    Par Kaori dans le forum MFC
    Réponses: 12
    Dernier message: 11/04/2005, 15h26

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