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 :

socket send et recv


Sujet :

Réseau C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 174
    Points : 74
    Points
    74
    Par défaut socket send et recv
    Bonjour,

    je suis débutant dans la programmation socket et j'ai déja eu des probleme que j'ai pu résoudre grace à l'aides des membres de ce site.

    J'ai aujourd'hui un nouveau probleme.
    voici mes code(je précise que je suis sur linux)

    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
     
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h> 
     
    #define INVALID_SOCKET -1
    #define SOCKET_ERROR -1
    #define closesocket(param) close(param)
     
    typedef int SOCKET;
    typedef struct sockaddr_in SOCKADDR_IN;
    typedef struct sockaddr SOCKADDR;
     
    int main()
    {
     
    SOCKET sock;
    char *buffer="buffer";
    sock=socket (AF_INET, SOCK_STREAM, 0);
    SOCKADDR_IN sin;
    sin.sin_addr.s_addr = htonl (INADDR_ANY);
    sin.sin_family = AF_INET;
    sin.sin_port = htons (65535);
    bind (sock, (SOCKADDR *) &sin, sizeof sin);
    listen(sock, 5);
    int taille = (int) sizeof(sin);
    accept (sock, (SOCKADDR *) &sin, &taille);
    printf("quelqu'un vient de se conecter\n");
    send(sock,buffer,strlen(buffer),0);
    closesocket(sock);
     
    return EXIT_SUCCESS;
    }


    code 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
     
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h> 
     
    #define INVALID_SOCKET -1
    #define SOCKET_ERROR -1
    #define closesocket(param) close(param)
     
    typedef int SOCKET;
    typedef struct sockaddr_in SOCKADDR_IN;
    typedef struct sockaddr SOCKADDR;
     
    int main()
    {
     
    SOCKET sock;
    char buffer[30];
    sock=socket(AF_INET, SOCK_STREAM, 0);
    SOCKADDR_IN sin;
    sin.sin_addr.s_addr = inet_addr("127.0.0.1");
    sin.sin_family = AF_INET;
    sin.sin_port = htons (65535);
    connect(sock, (SOCKADDR *)&sin, sizeof(sin));
    recv(sock,buffer,strlen(buffer),0);
    printf("%s\n",buffer);
    closesocket(sock);
     
    return EXIT_SUCCESS;
    }
    Comme vous pouvez le voir des que le programme client se connecte au serveur, le programme serveur affiche "quelqu'un vient de se conecter".
    Jusque la tout fonctionne bien.

    Ensuite le programme doit envoyer le message bonjour au client qui doit afficher le message bonjour.
    Cepandant le seul "message" que le client m'affiche est celui ci:
    http://saunivers.ifrance.com

    Pouvez vous m'aidez à résoudre ce probleme?

    merci d'avance

  2. #2
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    Salut,

    J'ai fait les corrections ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ...
    /* La chaine de caractere doit se terminer par un saut de ligne (\n, \r ou \r\n) */
    char *buffer = "buffer\r\n";
    ...
    /* Ici, c'est OK */
    send (sock, buffer, strlen (buffer), 0);
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ...
    char buffer[30];
    ...
    /* strlen (buffer) dans l'etat actuel vaut 0. On ne recoit donc aucune donnee.
       la fonction recv attend la taille maximale du buffer, on utilise donc sizeof. */
    recv (sock, buffer, sizeof buffer, 0);
    /* Cependant, on recoit uniquement la chaine de caractere, sans le 0 final.
       A toi de le rajouter. Pour cela, il faut récupérer le nombre de bytes recus
       (retour de la fonction recv) et placer le 0 à la fin (si il reste de la place). */
    ...
    Bref, il reste encore des améliorations à faire. Si je me souviens bien, tu avais déjà posté à ce sujet, et je t'avais donné 2-3 conseils. Apparament tu ne les as pas suivi...

  3. #3
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Vérifie que les appels aux fonctions (socket, bind, connect, send, read) se sont bien déroulé !!!

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 174
    Points : 74
    Points
    74
    Par défaut
    salut,

    merci de m'avoir répondu je n'ai en effet pas suivit tes conseil car pour l'instant je debute et donc je met un peu tout en vrac mais des que j'aurai réussi a transmettre le message bonjour je réorganiserai mon code en suivant tes conseil

    D[r]eadLock, si une ou certaine de mes fonctionaurait buger le code ne serai pas arriver a send ou recv.
    Or je reçoit quand meme des chose. Des chose bizarre mais des chose quand meme. Je me trompe?

  5. #5
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Le message que tu transmets actuellement ne contient pas de \0. Donc à la reception il faudrait le mettre manuellement (à l'aide du nombre d'octets ecrits dans le buffer, à savoir ce qui est retourné par recv). L'autre solution serait de transmettre "message" avec comme taille "strlen(message) + 1" (ce qui incluerait le \0 de la chaine d'origine dans le message à transmettre)

  6. #6
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Citation Envoyé par sebatlante Voir le message
    Or je reçoit quand meme des chose.
    Comment le sais-tu ? Il n'y a rien qui puisse (a part que le programme plante) t'empêcher d'aller jusqu'à l'affichage, et comme tu n'as pas initialisé ton buffer (il contient dont n'importe quoi) ...

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 174
    Points : 74
    Points
    74
    Par défaut
    je le sais parce que il m'affiche quelque chose comme je l'ai montrer sur l'image.

    Je peut toute fois me tromper(car selon toi ya rien qui peut empecher l'affichage)...Je suis encore debutant en programmation C.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 174
    Points : 74
    Points
    74
    Par défaut
    je vais ESSAYER de mettre mon code au clair

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 174
    Points : 74
    Points
    74
    Par défaut
    j'ai remis un peu d'ordre dans mon 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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
     
     
    #define INVALID_SOCKET -1
    #define SOCKET_ERROR -1
    #define closesocket(param) close(param)
     
    typedef int SOCKET;
    typedef struct sockaddr_in SOCKADDR_IN;
    typedef struct sockaddr SOCKADDR;
     
    int main()
    {
    	printf("salut\n");
     
    	SOCKET sock;
    	SOCKADDR_IN sin;
    	char *buffer="buffer\r\n";
     
    	if(sock=socket (AF_INET, SOCK_STREAM, 0) != INVALID_SOCKET)
    	{
    		printf("aucun probleme dans la condition pour la fonction socket\n");
    		sin.sin_addr.s_addr = htonl (INADDR_ANY);
    		sin.sin_family = AF_INET;
    		sin.sin_port = htons (65535);
    		if(bind (sock, (SOCKADDR *) &sin, sizeof(sin)) != SOCKET_ERROR)
    		{
    			printf("aucun probleme dans la condition pour la fonction bind\n");
    			if(listen(sock, 5) != SOCKET_ERROR);
    			{
    				printf("aucun probleme dans la condition pour la fonction listen\n");
    				int taille = (int) sizeof(sin);
    				if(accept (sock, (SOCKADDR *) &sin, &taille) != SOCKET_ERROR)
    				{
    					printf("aucun probleme dans la condition pour la fonction accept\n");
    					printf("quelqu'un vient de se conecter\n");
    					send(sock,buffer,strlen(buffer),0);
    				}
    			}
    		}
    	}
    closesocket(sock);
     
    return EXIT_SUCCESS;
    }
    C'est mieux?
    je ferai le client demain et je vous dirai si j'ai un probleme.

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par sebatlante Voir le message
    j'ai remis un peu d'ordre dans mon serveur:
    <...>
    C'est mieux?
    Non.

    accept() retourne l'adresse d'un socket client. C'est celui-ci qui doit être utilisé dans le send() et non le socket du serveur. Il faut donc commencer par le sauvegarder, puis l'utiliser correctement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       SOCKET sock_cli = accept (sock, (SOCKADDR *) &sin, &taille);
       if(sock_cli != SOCKET_ERROR)
       {
          printf("aucun probleme dans la condition pour la fonction accept\n");
          printf("quelqu'un vient de se conecter\n");
          send(sock_cli, buffer, strlen(buffer), 0);
       }
    N'oublie pas qu'un serveur peut gérer des milliers de clients (donc des milliers de sockets clients) en même temps.
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 174
    Points : 74
    Points
    74
    Par défaut
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
     
     
    #define INVALID_SOCKET -1
    #define SOCKET_ERROR -1
    #define closesocket(param) close(param)
     
    typedef int SOCKET;
    typedef struct sockaddr_in SOCKADDR_IN;
    typedef struct sockaddr SOCKADDR;
     
    int main()
    {
    	SOCKET sock;
    	SOCKET sock_client;
    	SOCKADDR_IN sin;
    	char *buffer="buffer\r\n";
    	int type=1;
     
    	if(sock=socket (AF_INET, SOCK_STREAM, 0) != INVALID_SOCKET)
    	{
    		printf("aucun probleme dans la condition pour la fonction socket\n");
    		sin.sin_addr.s_addr = htonl (INADDR_ANY);
    		sin.sin_family = AF_INET;
    		sin.sin_port = htons (65535);
    		bind (sock, (SOCKADDR *) &sin, sizeof(sin));
    		if(sock != SOCKET_ERROR)
    		{
    			printf("aucun probleme dans la condition pour la fonction bind\n");
    			listen(sock, 5);
    			if(sock != SOCKET_ERROR);
    			{
    				printf("aucun probleme dans la condition pour la fonction listen\n");
    				int taille = (int) sizeof(sin);
    				while(type)
    				{
    					sock_client=accept (sock, (SOCKADDR *) &sin, &taille);
    					if(sock_client != SOCKET_ERROR)
    					{
    						printf("aucun probleme dans la condition pour la fonction accept\n");
    						printf("quelqu'un vient de se conecter\n");
    						send(sock,buffer,strlen(buffer),0);
    						type=0;
    					}
    				}
    			}
    		}
    	}
    closesocket(sock);
     
    return EXIT_SUCCESS;
    }
    C'est mieux la?

    PS:Merci beaucoup à tous pour m'avoir aider sur les socket

  12. #12
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par sebatlante Voir le message
    C'est mieux la?
    Oui, mais tu n'as pas l'air convaincu... Tu as essayé ?
    Pas de Wi-Fi à la maison : CPL

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 174
    Points : 74
    Points
    74
    Par défaut
    oui je l'ai tester mais sans conexion car j'ameliore aussi mon client en ce moment

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 174
    Points : 74
    Points
    74
    Par défaut
    alors j'ai fait le code ci dessous mais il y a quelque chose qui ne fonctionne pas car le client ne se connecte pas au 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
     
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h> 
     
    #define INVALID_SOCKET -1
    #define SOCKET_ERROR -1
    #define closesocket(param) close(param)
     
    typedef int SOCKET;
    typedef struct sockaddr_in SOCKADDR_IN;
    typedef struct sockaddr SOCKADDR;
     
    int main()
    {
     
    printf("debut\n");
     
    SOCKET sock_client;
    char buffer[30];
    SOCKADDR_IN sin;
     
    sock_client=socket(AF_INET, SOCK_STREAM, 0);
    if(sock_client != INVALID_SOCKET)
    {
    	printf("aucun probleme dans la fonction socket\n");
    	sin.sin_addr.s_addr = inet_addr("127.0.0.1");
    	sin.sin_family = AF_INET;
    	sin.sin_port = htons (65535);
    	if(connect(sock_client, (SOCKADDR *)&sin, sizeof(sin)) != SOCKET_ERROR)
    	{
    		printf("aucun probleme dans la fonction connect\n");
    		recv(sock_client,buffer,strlen(buffer),0);
    		printf("%s\n",buffer);
    	}
    }
    closesocket(sock_client);
     
    return EXIT_SUCCESS;
    }
    je ne comprend pas aussi l'interet d'avoir un socket serveur et un socket client sur le serveur car sur les tutoriaux où j'ai appris il y avait que le socket serveur.

    Pourrai tu m'éclairer la dessus Emmanuel ?

    merci

  15. #15
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par sebatlante Voir le message
    alors j'ai fait le code ci dessous mais il y a quelque chose qui ne fonctionne pas car le client ne se connecte pas au serveur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SOCKET sock_client;
    char buffer[30];
    <...>
    		printf("aucun probleme dans la fonction connect\n");
    		recv(sock_client,buffer,strlen(buffer),0);
    		printf("%s\n",buffer);
    Ceci n'a aucun sens : Il a déjà été expliqué que la réception se faisait par rapport à la taille du tableau, et non strlen() qui n'a aucun sens (le tableau n'est pas initialisé). D'autre part, la chaine reçue ne sera valable que si on ajoute le 0 final. On utilise pour ça le nombre de caractères reçus, et on réserve une place pour le 0 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                int rec = recv (sock_client, buffer, sizeof buffer - 1, 0);
                if (rec > 0)
                {
                   buffer[rec] = 0;
                   printf("%s\n",buffer);
                }
    Détails ici :

    http://emmanuel-delahaye.developpez....eaux.htm#texte
    je ne comprend pas aussi l'interet d'avoir un socket serveur et un socket client sur le serveur
    Parce que c'est comme ça que fonctionne accept()...

    http://www.iprelax.fr/doc/socket_c8.php
    car sur les tutoriaux où j'ai appris il y avait que le socket serveur.
    Prouve le !
    Pas de Wi-Fi à la maison : CPL

  16. #16
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    http://emmanuel-delahaye.developpez.com/reseaux.htm

    et surtout les références sérieuses en fin d'article.
    Pas de Wi-Fi à la maison : CPL

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 174
    Points : 74
    Points
    74
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Ahem, vraiment pas une référence...
    lol ok.
    Je vais faire suivre tes conseil car pour l'instant ils ont toujour fonctionner

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 174
    Points : 74
    Points
    74
    Par défaut
    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
     
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h> 
     
    #define INVALID_SOCKET -1
    #define SOCKET_ERROR -1
    #define closesocket(param) close(param)
     
    typedef int SOCKET;
    typedef struct sockaddr_in SOCKADDR_IN;
    typedef struct sockaddr SOCKADDR;
     
    int main()
    {
     
    printf("debut\n");
     
    SOCKET sock_client;
    char buffer[30];
    SOCKADDR_IN sin;
    int rec;
     
    sock_client=socket(AF_INET, SOCK_STREAM, 0);
    if(sock_client != INVALID_SOCKET)
    {
    	printf("aucun probleme dans la fonction socket\n");
    	sin.sin_addr.s_addr = inet_addr("127.0.0.1");
    	sin.sin_family = AF_INET;
    	sin.sin_port = htons (65535);
    	sock_client=connect(sock_client, (SOCKADDR *)&sin, sizeof(sin));
    	if(sock_client != SOCKET_ERROR)
    	{
    		printf("aucun probleme dans la fonction connect\n");
    		rec = recv (sock_client, buffer, sizeof(buffer)- 1, 0);
                if (rec > 0)
                {
                   buffer[rec] = 0;
                   printf("%s\n",buffer);
                }
    	}
    }
    closesocket(sock_client);
     
    return EXIT_SUCCESS;
    }
    le code ne fonctionne pas non plus. Le probleme viendrait aparement de la fonction connect car la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("aucun probleme dans la fonction connect\n");
    n'est pas executé.
    Cepandant je ne voit pas où est le probleme ...Une idée?
    Je vais continuer a chercher en attendant une réponse.

    PS:Je faisais aucune difference entre un sizeof et strlen avant (eh oui je suis pas un pro comme vous mais seulement un debutant)mais maintenant c'est plus clair. Merci emmanuel

  19. #19
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par sebatlante Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	sin.sin_addr.s_addr = inet_addr("127.0.0.1");
    	sin.sin_family = AF_INET;
    	sin.sin_port = htons (65535);
    	sock_client=connect(sock_client, (SOCKADDR *)&sin, sizeof(sin));
    Gné ? C'est
    err = connect(sock_client, (SOCKADDR *)&sin, sizeof(sin));
    D'autre part, le serveur est-il bien sur la même machine ?
    Le port 65535 du serveur est-il ouvert
    Ce port est-il valide ?
    Pas de Wi-Fi à la maison : CPL

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 174
    Points : 74
    Points
    74
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    D'autre part, le serveur est-il bien sur la même machine ?
    Le port 65535 du serveur est-il ouvert
    Ce port est-il valide ?
    Le serveur est bien sur la meme machine(qui est sous linux) d'où 127.0.0.1.
    Le port 65535 est bien ouvert sur le serveur et est valide.

    J'ai fait les modif:

    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
     
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h> 
     
    #define INVALID_SOCKET -1
    #define SOCKET_ERROR -1
    #define closesocket(param) close(param)
     
    typedef int SOCKET;
    typedef struct sockaddr_in SOCKADDR_IN;
    typedef struct sockaddr SOCKADDR;
     
    int main()
    {
     
    SOCKET sock_client;
    char buffer[30];
    SOCKADDR_IN sin;
    int rec;
    int error;
     
    sock_client=socket(AF_INET, SOCK_STREAM, 0);
    if(sock_client != INVALID_SOCKET)
    {
    	printf("aucun probleme dans la fonction socket\n");
    	sin.sin_addr.s_addr = inet_addr("127.0.0.1");
    	sin.sin_family = AF_INET;
    	sin.sin_port = htons (65535);
    	error=connect(sock_client, (SOCKADDR *)&sin, sizeof(sin));
    	if(error == 0)
    	{
    		printf("aucun probleme dans la fonction connect\n");
    		rec = recv (sock_client, buffer, sizeof(buffer)- 1, 0);
                if (rec > 0)
                {
                   buffer[rec] = 0;
                   printf("%s\n",buffer);
                }
    	}
    }
    closesocket(sock_client);
    //-------------------------------------------------------------------------fin du code non minimal----------------------------------------
    return EXIT_SUCCESS;
    }
    Cela ne fonctionne toujour pas, la fonction connect renvoie -1...

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/02/2015, 18h06
  2. Sur un socket : send et recv ou read et write ?
    Par Médinoc dans le forum Réseau
    Réponses: 35
    Dernier message: 05/11/2009, 15h51
  3. [socket] Pb send() et recv()
    Par Tymk dans le forum C++
    Réponses: 6
    Dernier message: 03/06/2008, 18h44
  4. [Socket] Send/Recv type double sur architectures différentes
    Par nicolas.pied dans le forum Réseau
    Réponses: 4
    Dernier message: 31/03/2006, 20h33

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