alex2423 | j'aimerais bien faire 2 dialoguer un client serveur avec les sockets normal bloquantes. J'arrive a envoyer des données mais au bout d'un moment le fonction send bloque.
Malheuresement j'ai vu dans l'aide de send :
Citation :
Si la socket ne dispose pas de la place suffisante pour le message,
alors send va bloquer, à moins que la socket ait été configurée en mode
d'entrées/sorties non-bloquantes auquel cas elle renverra EAGAIN. On
peut utiliser l'appel système select(2) pour vérifier s'il est possible
d'émettre des données.
|
qu'une sockete dispose d'une quantité de placé limité. Comment faire avec des sockete bloquante car je n'ai pas envie de me lancer dans des socket non bloquante. le client en voie un message le serveur repond
le client repond le serveur repond .....
et ainsi de suite, je n'ai pas besoin de sockete non bloquantes
CLIENT
Code :
- #define MAXDATASIZE 200 /* Tampon d'entrée */
- int 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 */
-
- char *buf=NULL;
- rcv.pile = malloc (MAX_PILE_RECEPTION);
-
-
- if (argc != 2)
- {
- fprintf(stderr,"usage: client hostname\n" );
- exit(1);
- }
- printf("\n Etabilssement de la connexion sur le serveur %s\n",argv[1]);
-
- if ((he=gethostbyname(argv[1])) == NULL)
- { /* Info de l'hôte */
- herror("gethostbyname" );
- exit(1);
- }
-
- 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);
- }
- while (j < 4)
- {
- j++; printf("\n\n\n j == %d\n, strlen(buf) = %d", j, strlen(buf));
- printf("\n buf : \n %s\n",buf);
- printf("\n<<---------------------------- envoi ------------------------------->>\n" );
-
- if (send(sockfd, buf, strlen(buf), 0) == -1)
- {
- perror("send" );
- }
-
-
- if (buf != NULL) free(buf);
- buf = malloc (MAXDATASIZE);
- if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1)
- {
- perror("recv" );
- exit(1);
- }
- buf[numbytes] = '\0';
- printf("\n\n\n<<---------------------- Reception ------------------------------->>\n" );
-
-
- if (seg.c_ack == 1 && seg.syn == 1)
- {
- printf("\n Connexion reussi avec le serveur (ack=1 & syn=1)\n" );
-
-
- }
-
- }
-
- close(sockfd);
- return 0;
- }
|
SERVEUR
Code :
- //serveur
- #define MAXDATASIZE 200 /* Tampon d'entrée */
- main()
- {
- int sockfd, new_fd, numbytes; /* 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;
- //char buf[MAXDATASIZE];
- int j=0;
- rcv.pile = malloc (MAX_PILE_RECEPTION);
-
- //buffer pour la reception et emmsion des données
- //allocation faites avec affectation_envoi
- char *buf = NULL;
- int bits=32;
- //char *entete = malloc ( bits * sizeof (int)+1);
- affectation_position_entete ();
- if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
- {
- perror("\nsocket\n" );
- 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("\nbind\n" );
- exit(1);
- }
- /*
- if( getpeername (sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr) ) == -1)
- {
- perror("\ngetpeername\n" );
- exit(1);
- }*/
- if (listen(sockfd, BACKLOG) == -1)
- {
- perror("\nlisten\n" );
- exit(1);
- }
- fflush(stdout);
-
-
-
-
- printf("\n <---------------------accept---------------------------->\n" );
- sin_size = sizeof(struct sockaddr_in);
- if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1)
- {
- perror("\naccept\n" );
- }
- else
- {
- printf("\n connexion accept\n" );
- }
-
-
-
- while(j<5)
- {
- j++; printf("\n\n\n j == %d\n",j);
- /* main accept() loop */
- if (buf != NULL) printf("\nfree de buf\n" );
- buf = malloc (MAXDATASIZE);
- ;
- printf("\n<<---------------------------- reception ------------------------------->>\n" );
- if ((numbytes=recv(new_fd, buf, MAXDATASIZE, 0)) == -1)
- {
- perror("\nrecv_serveur\n" );
- exit(1);
- }
-
- buf[numbytes] = '\0';
-
-
- affectation_seg(buf);
- if (seg.c_ack == 0 && seg.syn == 1)
- {
- printf("\n\n\n\n<----Debut de connexion---->\n" );
-
- printf("\n<<---------------------------- envoi ------------------------------->>\n" );
- if (send(new_fd, buf, strlen(buf), 0) == -1)
- {
- perror("send" );
- }
-
-
- }
- else
- {
- if ( !(snd.una.valeur < seg.ack && seg.ack <= snd.nxt) )
- {
- printf("\n reception du numero d'acquitement incorrect\n envoie d'un ack = 0\n" );
- snd.c_ack = 0;
- }
- else if ( !(rcv.una.valeur < seg.seq && seg.seq <=rcv.nxt) )
- {
- printf("\n reception du numero de sequence incorrect\n envoie d'un ack = 0\n" );
- snd.c_ack = 0;
- }
- }
- fflush(stdout);
-
- }
- close(new_fd);
-
- }
- }
|
Message édité par alex2423 le 23-06-2004 à 22:30:22
|