Forum général.cherche-logiciel socket tcp

Posté par  .
Étiquettes : aucune
0
29
juin
2006
j'ai fait un client et un serveur qui communiquent par socket TCP, mon serveur est en attente de connection alors que mon client se bloque au niveau de la connection en affichant une erreur; le client et le serveur sont sur la machine locale.

le programme client est:
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>

#define MAX_SEND 100

int main()
{
int socket_connect, sockaddr_len;
struct sockaddr_in sockaddr_connect;
char buffer[MAX_SEND];

if(socket_connect = socket(AF_INET, SOCK_STREAM, 0) < 0)
{
printf("Socket creation errror !\n" );
return EXIT_FAILURE;
}

sockaddr_connect.sin_family = AF_INET;
sockaddr_connect.sin_port = htons(0);//5000;//6667;
sockaddr_connect.sin_addr.s_addr =inet_addr("127.0.0.1" );

sockaddr_len = sizeof(sockaddr_connect);

if(connect(socket_connect, (struct sockaddr*)&sockaddr_connect, sockaddr_len) < 0)
{
printf("Socket connection error !\n" );
return EXIT_FAILURE;
}

while(1)
{
printf("send>" );
scanf("%s", &buffer);
send(socket_connect, buffer, MAX_SEND,0);
}

close(socket_connect);

return 0;
}
  • # plus dinfos ?

    Posté par  . Évalué à 2.

    1. création de la socket:

    ... = socket (PF_INET, ...)

    t'as de la chance qu'en pratique, AF_INET = PF_INET


    2. sockaddr_connect.sin_port = htons(0);

    et t'espères pouvoir te connecter sur le port 0 ?

    3. > man connect
    ...
    If the connection or binding succeeds, zero is returned. On error, -1 is returned, and errno is set appropriately.
    ...

    donc:
    erreur = connect(...);
    if (erreur==-1){
    perror ("connect");
    return EXIT_FAILURE;
    }

    et tu nous donnes le résulat ...
    • [^] # Re: plus dinfos ?

      Posté par  . Évalué à 1.

      je n'arrive toujours pas à se conneter au serveur qui est en attente et voici la nouvelle erreur qu'il m'affiche après avoir mis ce que tu m'as indiqué :connect: Socket operation on non-socket
      • [^] # Re: plus dinfos ?

        Posté par  . Évalué à 2.

        ca t'apprendra a vouloir écrire du code compliqué et illisible!
        donc, saches que en C:

        a = b < c <=> a = (b < c)

        donc, dans ton code, la ligne pourrie
        if(socket_connect = socket(AF_INET, SOCK_STREAM, 0) < 0) { ...
        doit être remplacée par:

        socket_connect = socket(AF_INET, SOCK_STREAM, 0);
        if (socket_connect < 0) {
        ...

        ceci empechera d'avoir socket_connect qui vait toujours 0.
        • [^] # Re: plus dinfos ?

          Posté par  . Évalué à 1.

          d'ailleurs, ou aussi :

          if((socket_connect = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
              ...
          }
  • # Port 0

    Posté par  (site web personnel) . Évalué à 3.

    Ton client se connecte sur le port 0 ?
    • [^] # Re: Port 0

      Posté par  . Évalué à -1.

      Le port 0, c'est pour laisser à l'OS le choix du port à utiliser. En gros, c'est ce qui est fait par un connect, puisque tu te fous du port local.
      Par contre, dans le cas d'un client comme ici, le client va se connecter sur un port aléatoire.
      Il suffit de mettre ici le port utilisé par le serveur (passé dans struct sockaddr_in utilisé pour le bind).
      • [^] # Re: Port 0

        Posté par  . Évalué à 1.

        Le port 0, c'est pour laisser à l'OS le choix du port à utiliser.

        sans blagues ... démarre un tcpdump, juste pour voir. il y a un paquet TCP qui part pour une demande de connexion sur le port distant = 0
        (localhost.localdomain.32812 > localhost.localdomain.0: S [...])

        Tu confonds le port local et le port distant; La struct sockaddr passée en argument de la fonction connect sert à spécifier l'addresse distante, et n'a rien à voir avec le port local qui est utilisé.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.