Hello,

J'ai un prog 'serveur.c' et un prog 'client.c' qui marche bien : mais qui ne font pas grand chose.
-> le serveur affiche la connexion du client
-> le serveur envoi un message au client
-> le client recoi le message du serveur et l'affiche ds la console
-> le client envoi un message au serveur
-> le serveur affiche le message du client ds la console serveur.

Voila et a la fin le serveur reste ouvert, par contre le client se ferme !!

Voici mon 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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <string.h>
 
#define MYPORT 3490    /* Le port ou les utilisateurs se =connecteront */
 
#define BACKLOG 10     /* Nombre maxi de connections acceptees en file */
#define MAXDATASIZE 200 /* Tampon d'entree */
 
main()
{
	//variables nécessaires Ã* la préparation du message Ã* envoyer
	char mess[] = "Hello, num ";
	int len = strlen(mess) +50;
	char buf_mess[len];
	int cpt = 0;
 
	char buf[MAXDATASIZE];
 
	//vairable client serveur
	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 connecte  */
	int sin_size;
 
 
	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: Recu connection de %s\n", inet_ntoa(their_addr.sin_addr));
 
		if (!fork())
		{ /* processus fils */
			cpt = cpt + 1;
			//construction du message Ã* envoyer
			snprintf(buf_mess, len, "%s %d", mess, cpt);
 
			//envoi du message
			if (send(new_fd, buf_mess, 14, 0) == -1)
				perror("send");
 
			close(new_fd);
			exit(0);
		}
 
		if ((numbytes=recv(new_fd, buf, MAXDATASIZE, 0)) == -1)
		{
			perror("recv");
			exit(1);
		}
		buf[numbytes] = '\0';
 
		printf("Recu: %s\n",buf);
 
		close(new_fd);  /* Le parent n'a pas besoin de cela */
 
		while(waitpid(-1,NULL,WNOHANG) > 0); /* Nettoyage des processus fils */
	}
}
et mon 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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
 
#define PORT 3490    /* Le port ou le client se connectera */
 
#define MAXDATASIZE 200 /* Tampon d'entree */
 
main()
{
	int sockfd, numbytes;
	char buf[MAXDATASIZE];
	struct hostent *he;
	struct sockaddr_in their_addr; /* Adresse de celui qui se connecte */
 
 
	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);
	their_addr.sin_addr.s_addr = INADDR_ANY;
	//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("Recu: %s\n",buf);
 
	//test de l'envoi pour un client
	if (send(sockfd, "client", 14, 0) == -1)
		perror("send");
 
	close(sockfd);
 
	return 0;
    }