int main(int argc, char* argv[]){ SOCKADDR_IN adresse;//client int port; SOCKET socket_ecoute, socket_service; port = atoi(argv[1]); socket_ecoute = creer_socket(SOCK_STREAM, port, &adresse); listen(socket_ecoute,5); while(1){ printf("\nAttente connection...\n"); /*Acceptation d'une connexion pendante*/ socket_service = accept(socket_ecoute,(SOCKADDR*)&adresse,sizeof(SOCKADDR_IN)); printf("\nNouvelle connection\n"); if(fork() == 0){ close(socket_ecoute); client_service(socket_service); } close(socket_service); } return 0; }
int main(int argc, const char *argv[]) { int i = 0; size_t client_capacity = 100; size_t total_capacity = 101; //+1 extra for server socket int srv_fd = -1; struct sockaddr_in srv_addr; int epoll_fd = -1; struct epoll_event e, *es; if (argc == 2) { client_capacity = atoi(argv[1]); //read capacity from program argument list total_capacity = client_capacity + 1; } USER_LIST = create_ul(client_capacity); memset(&srv_addr, 0, sizeof(srv_addr)); memset(&e, 0, sizeof(e)); es = malloc((total_capacity) * sizeof(struct epoll_event)); srv_fd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0); if (srv_fd < 0) { printf("Cannot create socket\n"); return 1; } srv_addr.sin_family = AF_INET; srv_addr.sin_addr.s_addr = htonl(INADDR_ANY); srv_addr.sin_port = htons(5553); if (bind(srv_fd, (struct sockaddr*) &srv_addr, sizeof(srv_addr)) < 0) { printf("Cannot bind socket\n"); close(srv_fd); return 1; } if (listen(srv_fd, total_capacity) < 0) { printf("Cannot listen\n"); close(srv_fd); return 1; } epoll_fd = epoll_create(total_capacity); if (epoll_fd < 0) { printf("Cannot create epoll\n"); close(srv_fd); return 1; } e.events = EPOLLIN; e.data.fd = srv_fd; if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, srv_fd, &e) < 0) { printf("Cannot add server socket to epoll\n"); close(epoll_fd); close(srv_fd); return 1; } for(;;) { i = epoll_wait(epoll_fd, es, total_capacity, -1); if (i < 0) { printf("Cannot wait for events\n"); close(epoll_fd); close(srv_fd); return 1; } for (--i; i > -1; --i) { if (es[i].data.fd == srv_fd) { if (server_service(srv_fd, epoll_fd)) { return 1; } } else { client_service(es[i].data.fd, es[i].events, epoll_fd); } } } return 0; }