Bonjour,

Dites moi, il s'agit peut-être d'un comportement normal mais je souhaiterais m'en assurer. Je crée une socket serveur et j'ai une thread qui gère les connections et les lectures, via un select. J'ai donc un fd_set dans lequel je rajoute tous les file descriptors des sockets. J'ai remarqué qu'après un select sur ce fd_set, ce dernier est modifié: il y a des file descriptors qui changent, et le prochain select ne fonctionne pas correctement. Du coup, je suis obligé avant chaque select de reconstruire le fd_set. Est-ce normal ? Cf mon code ci-dessous, avec les premières lignes qui permettent de reconstruire le fd_set:

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
 
while(1)
{
	/* Building SocketList */
	FD_ZERO(&SocketList);
	for(ListNum = 0; ListNum < 5; ListNum++)
	{
		if(ConnectList[ListNum] != 0)
		{
			FD_SET(ConnectList[ListNum], &SocketList);
		}
	}
 
 
	iResult = select(highDescriptor+1, &SocketList, NULL, NULL, NULL);
	if(iResult < 0)
	{
		printf("Select failed\n");
	}
	else if(iResult == 0)
	{
		printf("Nothing ready to read\n");
	}
	else
	{
		if(FD_ISSET(ListenSocket, &SocketList))
		{
			printf("New connection received\n");
			CurrentSocket = accept(ListenSocket, NULL, NULL);
			if (CurrentSocket == INVALID_SOCKET) 
			{
				printf("Accept failed: %d\n", WSAGetLastError());
				closesocket(ListenSocket);
				WSACleanup();
				return 1;
			}
			if(CurrentSocket > highDescriptor)
			{
				highDescriptor = CurrentSocket;
			}
			for(ListNum = 0; ListNum < 5; ListNum++)
			{
				if(ConnectList[ListNum] == 0)
				{
					ConnectList[ListNum] = CurrentSocket;
					break;
				}
			}
		}
		else 
		{
			for(ListNum = 0; ListNum < SocketList.fd_count; ListNum++)
			{
				if(FD_ISSET(SocketList.fd_array[ListNum], &SocketList))
				{
					iResult = recv(SocketList.fd_array[ListNum], buffer, 14, 0);
					printf("Deal with data: %s\n", buffer);
				}
			}
		}
	}
}