Je suis en train de faire un petit programme avec un serveur et un client qui communique à l'aide d'un socket.
Le problème est que le serveur quitte sans raison après avoir fait un send sans transmettre le message. Un peu d'aide serait sympa.

SYS(appel système) est un macro qui vérifie la valeur retournée par l'appel système. Si -1 le programme quitte.

Voici le code du 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
#include "projet.h"
 
int creer_socket();
 
int main(int argc, char** argv) {
	int retour;
	fd_set ens_fd;
	SOCKET sock;
	MESSAGE msg;
 
	sock = creer_socket();
	while(1) {
		FD_ZERO(&ens_fd);
		FD_SET(STDIN, &ens_fd);
		FD_SET(sock, &ens_fd);
		SYS(select(sock+1, &ens_fd, NULL, NULL, NULL));
		if (FD_ISSET(sock, &ens_fd)) {
			retour = recv(sock, &msg, sizeof(msg), 0);
			fprintf(stderr, "Retour = %d\n", retour);	// Pourquoi quand on fait ctrl c dans le serveur, le joueur recoit -1 puis 0 ?
			if (retour == 0) {
				printf("Le serveur a fermé le socket.\n");
				break;
			}
			else if (retour != sizeof(msg)) {
				printf("Le message n'est pas bien passé\n");
				exit(1);
			}
			else {
				fprintf(stderr, "Le message est : %s.\n", msg.message);
			}
		}
	}
}
 
int creer_socket() {
	SOCKET sock;
	SOCKADDR_IN addr;
	int retour;
	long flags;
 
	addr.sin_family = AF_INET;
	addr.sin_addr.s_addr = htonl(INADDR_ANY);
	addr.sin_port = htons(PORT);
 
	SYS(sock = socket(AF_INET, SOCK_STREAM, 0)); // PQ 0 ???
 
	retour = connect(sock, (SOCKADDR*) &addr, sizeof(addr));
 
	if (retour == -1) {
		fprintf(stderr, "Le serveur n'est pas en marche.\n");
		exit(1);
	}
	return sock;
}
Et celui du 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
#include "projet.h"
 
int creer_socket();
 
int main(int argc, char** argv) {	
	int nombre_fd = 0;
	int fd;
	int fd_max;
	int retour;
	int size_addr;
	SOCKET socket;
	SOCKET nouveau_sock;
	SOCKADDR_IN addr;
	fd_set ens_fd;
 
	socket = creer_socket();
	fd_max = socket;
 
	FD_ZERO(&ens_fd);
	FD_SET(socket, &ens_fd);
 
	SYS((nombre_fd = listen(socket, MAX_JOUEUR)));
	while(1) {
		SYS(select(fd_max + 1, &ens_fd, NULL, NULL, NULL));
		for (fd = 0; fd <= fd_max; fd++) {
			if (FD_ISSET(fd, &ens_fd)) {
				addr.sin_family = AF_INET;
				addr.sin_addr.s_addr = htonl(INADDR_ANY);
				addr.sin_port = htons(PORT);
				size_addr = sizeof(addr);
				SYS(nouveau_sock = accept(fd, (SOCKADDR *) &addr, &size_addr));
				if (nombre_fd < MAX_JOUEUR) {
					nombre_fd++;
				}
				FD_SET(nouveau_sock, &ens_fd);
				if (nouveau_sock > fd_max) {
					fd_max = nouveau_sock;
				}
				MESSAGE message;
				strcpy(message.message, "Coucou");
				retour = send(fd, &message, sizeof(message), 0);		// Problème ici. Le serveur ferme tout seul. Bizarre!!!
			}
		}
	}
}
 
int creer_socket() {
	SOCKET sock;
	SOCKADDR_IN addr;
	long flags;
 
	addr.sin_family = AF_INET;
	addr.sin_addr.s_addr = htonl(INADDR_ANY);
	addr.sin_port = htons(PORT);
 
	SYS(sock = socket(AF_INET, SOCK_STREAM, 0));
	SYS(flags = fcntl(sock, F_GETFL));
	SYS(fcntl(sock, F_SETFL, flags | O_NONBLOCK));
	SYS(bind(sock, (SOCKADDR *)&addr, sizeof(addr)));
	return sock;
}