| 12
 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
 
 |  
int getplace(struct pollfd *poll_list, int *size, int *maxfd)
{
	int i;
	for (i = 0; i < *size; i++) {
		if (poll_list[i].fd == -1 || poll_list[i].fd == 0) {
			if (i > *maxfd) {
				*maxfd = i;
			}
			return i;
		}
	}
	*size = *size*2;
	realloc(poll_list, *size);
 
	if ((i+1) > *maxfd) {
		*maxfd = (i+1);
	}
	return (i+1);
}
int sockroutine() // Jai galéré pour cette fonction, help :(
{
	int basemem = 1024, maxfd = 0, attributed;
 
	struct pollfd *poll_list = (struct pollfd *) malloc(1+sizeof(struct pollfd)*basemem);
	int s_listen, new_fd, old_flags, verif, sin_size = sizeof(struct sockaddr_in), i;
	struct sockaddr_in their_addr;
	char *pSock = (char*)malloc(1+sizeof(char)*MAX_IO);
 
	if ((s_listen = newSockListen(PORT)) < 0)
	{
		return 0;
	}
	old_flags = fcntl(s_listen, F_GETFL, 0);		// On récupère l'ancien bitmask
	fcntl(s_listen, F_SETFL, old_flags | O_NONBLOCK); // Et on lui ajoute le non bloquant = SOCKET non Bloquant
 
	attributed = getplace(poll_list, &basemem, &maxfd);
	poll_list[attributed].fd = s_listen;
	poll_list[attributed].events = POLLIN | POLLPRI;	
 
	while(1) {
			while (1) {
				verif = poll(poll_list, maxfd+1, -1);
				if (verif < 0) {
					continue;
				}
				for (i = 0; i <= maxfd; i++) {
					if (poll_list[i].fd == -1) {
						continue;
					}
					if (poll_list[i].revents & (POLLIN)) {
						if (poll_list[i].fd == s_listen) {
 
 
							if ((new_fd = accept(s_listen, (struct sockaddr *)&their_addr, (unsigned int *)&sin_size)) > 0) {
								old_flags = fcntl(new_fd, F_GETFL, 0);		// On récupère l'ancien bitmask
								fcntl(new_fd, F_SETFL, old_flags | O_NONBLOCK); // Et on lui ajoute le non bloquant = SOCKET non Bloquant
 
								attributed = getplace(poll_list, &basemem, &maxfd);
 
								poll_list[attributed].fd = new_fd;
								poll_list[attributed].events = POLLIN | POLLPRI;
 
							//	sendSock(new_fd, HEADER);
 
							//	close(new_fd);
							//	poll_list[attributed].fd = -1;
							}
 
 
						}
						else {
							if (recv(poll_list[i].fd, pSock, MAX_IO, 0) < 1) {
								if (poll_list[i].fd != s_listen) {
									poll_list[i].fd = -1;
								}
							} else {
								// traitement de pSock
								printf("recu de %i\n", poll_list[i].fd);
							}
						}
					}
				}
			}
		}
 
	return 0;
} | 
Partager