weed | bonjour, je comprends pas trop. Je pensais que le client envoyer les informations au serveur pour se connecter qu'a partir de la fonction connect () mais ca n'a pas l'air d'etre le cas ds mon exemple :
serveur.c :
Code :
- main()
- {
- int sockfd, new_fd; /* Ecouter sock_fd, nouvelle connection sur new_fd */
- struct sockaddr_in my_addr; /* Adresse */
- struct sockaddr_in their_addr; /* Adresse du connecté */
- int sin_size;
- int bits=32;
- char *entete = (char *) malloc ( bits * sizeof (int)+1);
- if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
- {
- perror("socket" );
- exit(1);
- }
- my_addr.sin_family = AF_INET; /* host byte order */
- my_addr.sin_port = htons(MYPORT); /* short, network byte order */
- my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-remplissage avec mon IP */
- bzero(&(my_addr.sin_zero), 8); /* zero pour le reste de struct */
- if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
- {
- perror("bind" );
- exit(1);
- }
- if (listen(sockfd, BACKLOG) == -1)
- {
- perror("listen" );
- exit(1);
- }
- while(1)
- { /* main accept() loop */
- sin_size = sizeof(struct sockaddr_in);
- if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1)
- {
- perror("accept" );
- continue;
- }
- printf("serveur: Connection recu de %s\n", inet_ntoa(their_addr.sin_addr));
- tmenu_saisi (entete);
- if (!fork())
- { /* processus fils */
- //printf("\npaquet envoyé : %s\n",entete,strlen(entete));
- affichage(entete);
- if (send(new_fd, entete, strlen(entete), 0) == -1)
- {
- perror("send" );
- }
- close(new_fd);
- exit(0);
- }
- close(new_fd); /* Le parent n'a pas besoin de cela */
- while(waitpid(-1,NULL,WNOHANG) > 0); /* Nettoyage des processus fils */
- }
- }
|
et le client.c
Code :
- nt main(int argc, char *argv[])
- {
- int sockfd, numbytes;
- char buf[MAXDATASIZE];
- struct hostent *he;
- struct sockaddr_in their_addr; /* Adresse de celui qui se connecte */
- int bits=32;
- char *paquet = (char *) malloc ( bits * sizeof (int)+1);
- if (argc != 2)
- {
- fprintf(stderr,"usage: client hostname\n" );
- exit(1);
- }
- printf("\n Etabilssement de la connexion sur le serveur %s",argv[1]);
- saisi_port (paquet);
- if ((he=gethostbyname(argv[1])) == NULL)
- { /* Info de l'hôte */
- herror("gethostbyname" );
- exit(1);
- }
- printf("ici" );
- if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
- {
- perror("socket" );
- exit(1);
- }
- their_addr.sin_family = AF_INET; /* host byte order */
- their_addr.sin_port = htons(PORT); /* short, network byte order */
- their_addr.sin_addr = *((struct in_addr *)he->h_addr);
- bzero(&(their_addr.sin_zero), 8); /* zero pour le reste de struct */
- if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1)
- {
- perror("connect" );
- exit(1);
- }
- if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1)
- {
- perror("recv" );
- exit(1);
- }
- buf[numbytes] = '\0';
- printf("Reçu: %s",buf);
- close(sockfd);
- return 0;
- }
|
je demare ./serveur
puis ./client 127.0.0.1
la fenetre client me demande de taper mes numéro de port (fonction saisi_port) puis apres le client mouline et attends une reponse du serveur. Et c'est la que je comprends pas. Le printf("ici" ); juste avant la fonction socket de client.c
Donc le client mouline, je vais sur la fenetre serveur et je tape mon entete avec ma fonction :tmenu_saisi (entete); et l'entete est envoyé au client et ce qu'a partir de la que j'ai la main sur le client. Le client affiche "ici"(printf("ici" ). Pourquoi pas avant ?
Comment pourrais je envoyer un paquet au serveur dans un premier pour lui dire, je me connecte sur toi et apres le serveur reponds au client, ok tu peux te connecter ... |