wip client arrived
This commit is contained in:
@@ -30,7 +30,7 @@
|
|||||||
// strstr
|
// strstr
|
||||||
// write
|
// write
|
||||||
|
|
||||||
#define BUFSIZE 1024
|
#define BUFSIZE 100
|
||||||
|
|
||||||
typedef struct s_client {
|
typedef struct s_client {
|
||||||
int fd;
|
int fd;
|
||||||
@@ -91,7 +91,7 @@ char *str_join(char *buf, char *add)
|
|||||||
return (newbuf);
|
return (newbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void add_client(t_client *first_client, int fd, int id) {
|
void add_client(t_client **first_client, int fd, int id) {
|
||||||
t_client *new_client;
|
t_client *new_client;
|
||||||
t_client *client;
|
t_client *client;
|
||||||
|
|
||||||
@@ -101,16 +101,35 @@ void add_client(t_client *first_client, int fd, int id) {
|
|||||||
new_client->fd = fd;
|
new_client->fd = fd;
|
||||||
new_client->id = id;
|
new_client->id = id;
|
||||||
new_client->next = NULL;
|
new_client->next = NULL;
|
||||||
if (!first_client)
|
if (!(*first_client))
|
||||||
first_client = new_client;
|
*first_client = new_client;
|
||||||
else {
|
else {
|
||||||
client = first_client;
|
client = *first_client;
|
||||||
while (client->next)
|
while (client->next)
|
||||||
client = client->next;
|
client = client->next;
|
||||||
client->next = new_client;
|
client->next = new_client;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void broadcast(char *buf, fd_set *set, int maxfd, int client_fd) {
|
||||||
|
for(int fd = 0; fd <= maxfd; ++fd) {
|
||||||
|
if (fd == client_fd)
|
||||||
|
continue;
|
||||||
|
if (FD_ISSET(fd, set))
|
||||||
|
send(fd, buf, strlen(buf), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// debug
|
||||||
|
void print_clients(t_client *client) {
|
||||||
|
printf("clients:");
|
||||||
|
while(client) {
|
||||||
|
printf("[%i - %i]", client->id, client->fd);
|
||||||
|
client = client->next;
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
int main(int ac, char **av) {
|
int main(int ac, char **av) {
|
||||||
int sockfd;
|
int sockfd;
|
||||||
int client_fd;
|
int client_fd;
|
||||||
@@ -121,6 +140,7 @@ int main(int ac, char **av) {
|
|||||||
fd_set write_set;
|
fd_set write_set;
|
||||||
t_client *client;
|
t_client *client;
|
||||||
t_client *first_client;
|
t_client *first_client;
|
||||||
|
char buf[BUFSIZE];
|
||||||
|
|
||||||
if (ac != 2)
|
if (ac != 2)
|
||||||
error("Wrong number of arguments\n");
|
error("Wrong number of arguments\n");
|
||||||
@@ -146,13 +166,15 @@ int main(int ac, char **av) {
|
|||||||
error("Fatal error\n");
|
error("Fatal error\n");
|
||||||
|
|
||||||
while(1) {
|
while(1) {
|
||||||
|
print_clients(first_client);
|
||||||
maxfd = sockfd;
|
maxfd = sockfd;
|
||||||
FD_ZERO(&read_set);
|
FD_ZERO(&read_set);
|
||||||
FD_ZERO(&write_set);
|
FD_ZERO(&write_set);
|
||||||
|
FD_SET(sockfd, &read_set);
|
||||||
client = first_client;
|
client = first_client;
|
||||||
while(client) {
|
while(client) {
|
||||||
write(1, "1", 1);
|
write(1, "1", 1);
|
||||||
printf("id: %i\n", client->id);
|
//printf("id: %i\n", client->id);
|
||||||
FD_SET(client->fd, &read_set);
|
FD_SET(client->fd, &read_set);
|
||||||
FD_SET(client->fd, &write_set);
|
FD_SET(client->fd, &write_set);
|
||||||
if (client->fd > maxfd)
|
if (client->fd > maxfd)
|
||||||
@@ -160,11 +182,13 @@ printf("id: %i\n", client->id);
|
|||||||
client = client->next;
|
client = client->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
select(maxfd + 1, &read_set, &write_set, NULL, NULL);
|
select(maxfd + 1, &read_set, NULL, NULL, NULL);
|
||||||
|
|
||||||
if (FD_ISSET(sockfd, &read_set)) {
|
if (FD_ISSET(sockfd, &read_set)) {
|
||||||
client_fd = accept(sockfd, NULL, NULL);
|
client_fd = accept(sockfd, NULL, NULL);
|
||||||
add_client(first_client, client_fd, id);
|
add_client(&first_client, client_fd, id);
|
||||||
|
sprintf(buf, "server: client %d just arrived\n", id);
|
||||||
|
broadcast(buf, &write_set, maxfd, client_fd) {
|
||||||
id++;
|
id++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user