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
|
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