• # Re: Problem avec send()

    Posté par . En réponse au message Problem avec send(). Évalué à 1.

    Salut,

    Tout d'abord quelques remarques:

    1 - Le client n'as besoin que de l'adresse du serveur pour envoyer le paquet donc il est inutile d'avoir clientAddress -- ton adresse le noyau s'en charge puisqu'il le connaît déjà.

    2 - Pour la même raison que précedemment, bind() n'est pas obligatoire du côté client -- c'est superflu.

    Enfin la raison pour laquelle ton code ne marche pas c'est que ton socket tu l'as rattachée à une addresse nulle:

    makeLocalSocketAdress(&clientAdress);

    if((bind(sock,(struct sockaddr*)&clientAdress,addrLength))==-1){ // bind socket

    printf("Error bind socket\n");exit(-1);

    }


    Alors qu'après tu veux envoyer le paquet au serveur:

    if (sendto(sock,msg,strlen(msg),0,(struct sockaddr *)&serverAdress,addrLength) !=0 ) {

    perror("Receive 1") ;

    printf("Error send to\n");}


    Donc je pense que c'est normal que le paquet ne soit pas envoyé. Pour simplifier, voilà un code qui devrait marcher.


    #include <sys/types.h>
    #include <sys/socket.h>
    #include <sys/time.h>

    #include <netinet/in.h>
    #include <netdb.h>

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>

    #define BUFSIZ 1024
    #define HOST localhost /* à changer */
    #define PORT 80

    void
    make_remote_socket_adress(struct sockaddr_in *sa, char * hostname, int port) {
    struct hostent *host;

    if ((host = gethostbyname(hostname)) == NULL) {
    printf("Unknown host name.\n");
    exit(-1);
    }

    memset(&sa, '0', sizeof(sa));
    sa->sin_family = AF_INET ;
    sa->sin_addr = memcpy(&sa.sin_addr, host->h_addr, host->h_length);
    sa->sin_port = htons(port);
    }

    int
    main(int argc, char *argv[]){

    int sock,
    int bytes_sent, msg_length;
    struct sockaddr_in server_address;
    char msg[BUFSIZ]; //message to send/receive

    sprintf(msg, "Hello World!\n");
    msg_length = strlen(msg) + 1;

    if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) = -1) {
    printf("Error creating socket.");
    exit(-1);
    }

    make_remote_socket_address(server_address, HOST, PORT);

    bytes_sent = sendto(sock, msg, msg_length, 0,(struct sockaddr*) &server_address, sizeof(struct sockaddr_in) );

    if (bytes_sent < 0) {
    perror("sendto");
    exit(-1);
    }

    close(sock);
    return 0;
    }


    Aprés, tu peux après rajouter les détails qui manquent et toussa (véritable addresse et port).

    NB: je n'ai pas testé le code donc je ne sais pas s'il est correct mais le principe est là.