Bonjour,

Je j'ai ce code :

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
 
void* ping(void* data)
{
	int port = *(int *)data;
    	SOCKET sock;
	int n = 0;
	char buffer[2];
   	SOCKADDR_IN sin = { 0 };
    	SOCKET csock;
	SOCKADDR_IN csin;
	socklen_t recsize = sizeof(csin);
	int sock_err;
	sock = socket(AF_INET, SOCK_DGRAM, 0);
	if(sock == INVALID_SOCKET)
	{
    		perror("socket()");
    		return NULL;
	}
 
	sin.sin_addr.s_addr = htonl(INADDR_ANY);
 
	sin.sin_family = AF_INET;
 
	sin.sin_port = htons(port);
 
	if(bind (sock, (SOCKADDR *) &sin, sizeof sin) == SOCKET_ERROR)
	{
    		perror("bind()");
    		return NULL;
	}
	struct hostent *hostinfo = NULL;
	SOCKADDR_IN from = { 0 };
	int fromsize = sizeof from;
	while(1){
	//poll + si fin, arrêter (break)
	if((n = recvfrom(sock, buffer, sizeof buffer - 1, 0, (SOCKADDR *)&from, &fromsize)) < 0)
	{
    		perror("recvfrom()");
    		return NULL;
	}
 
	buffer[n] = '\0';
 
	if(sendto(sock, buffer, n, 0, (SOCKADDR *)&from, fromsize) < 0)
	{
    		perror("sendto()");
    		return NULL;
	}
	}
	closesocket(sock);
	return NULL;
}
Le but est qu'à chaque réception de données, on la renvoie pour montrer que le serveur est en ligne.

J'aimerais pouvoir arrêter ce thread à partir du père.
Mais forcer l'arrêt du fils ne me semble pas très propre, de plus, il me semble que recvfrom fait de la scrutation acitive?

Afin d'économiser des ressources et de fermer correctement le fils, j'aimerais intégrer un poll();

ce poll() regardera s'il y a des données en entrée et si oui, laisse le recvfrom faire son boulot, sinon, au bout de x microsecondes, il regarde l'état d'une variable pour savoir s'il faut arrêter ou non la boucle.

Malheureusement, je n'ai pas très bien compris ce qu'il faut mettre dans les deux premiers arguments.

Pourriez-vous m'aider svp?