Simple echo client

This commit is contained in:
2020-12-10 20:55:33 +01:00
parent 24ce5d8cd6
commit 42b8aee4bd
3 changed files with 81 additions and 38 deletions

View File

@ -25,26 +25,22 @@ int main(int argc, const char *argv[]) {
fd_set socket_fds, read_socket_fds;
int max_socket_fd = 0;
int ready_sockets_num = 0;
long client_num = 0;
const struct sockaddr_in addresses[2] = {
{.sin_family = AF_INET, .sin_addr.s_addr = INADDR_ANY, .sin_port = htons(8080)},
{.sin_family = AF_INET, .sin_addr.s_addr = INADDR_ANY, .sin_port = htons(4443)}
};
const struct sockaddr_in6 addresses6[2] = {
parent_stdout = stdout;
parent_stderr = stderr;
const struct sockaddr_in6 addresses[2] = {
{.sin6_family = AF_INET6, .sin6_addr = IN6ADDR_ANY_INIT, .sin6_port = htons(8080)},
{.sin6_family = AF_INET6, .sin6_addr = IN6ADDR_ANY_INIT, .sin6_port = htons(4443)}
};
printf("Necronda Web Server\n");
SOCKETS[0] = socket(AF_INET, SOCK_STREAM, 0);
SOCKETS[0] = socket(AF_INET6, SOCK_STREAM, 0);
if (SOCKETS[0] == -1) goto socket_err;
SOCKETS[1] = socket(AF_INET, SOCK_STREAM, 0);
if (SOCKETS[1] == -1) goto socket_err;
SOCKETS[2] = socket(AF_INET6, SOCK_STREAM, 0);
if (SOCKETS[2] == -1) goto socket_err;
SOCKETS[3] = socket(AF_INET6, SOCK_STREAM, 0);
if (SOCKETS[3] == -1) {
SOCKETS[1] = socket(AF_INET6, SOCK_STREAM, 0);
if (SOCKETS[1] == -1) {
socket_err:
fprintf(stderr, ERR_STR "Unable to create socket: %s" CLR_STR "\n", strerror(errno));
return 1;
@ -58,9 +54,7 @@ int main(int argc, const char *argv[]) {
}
if (bind(SOCKETS[0], (struct sockaddr *) &addresses[0], sizeof(addresses[0])) == -1) goto bind_err;
if (bind(SOCKETS[1], (struct sockaddr *) &addresses[1], sizeof(addresses[1])) == -1) goto bind_err;
if (bind(SOCKETS[2], (struct sockaddr *) &addresses6[0], sizeof(addresses6[0])) == -1) goto bind_err;
if (bind(SOCKETS[3], (struct sockaddr *) &addresses6[1], sizeof(addresses6[1])) == -1) {
if (bind(SOCKETS[1], (struct sockaddr *) &addresses[1], sizeof(addresses[1])) == -1) {
bind_err:
fprintf(stderr, ERR_STR "Unable to bind socket to address: %s" CLR_STR "\n", strerror(errno));
return 1;
@ -85,7 +79,7 @@ int main(int argc, const char *argv[]) {
while (1) {
read_socket_fds = socket_fds;
ready_sockets_num = select(max_socket_fd, &read_socket_fds, NULL, NULL, NULL);
ready_sockets_num = select(max_socket_fd + 1, &read_socket_fds, NULL, NULL, NULL);
if (ready_sockets_num == -1) {
fprintf(stderr, ERR_STR "Unable to select sockets: %s" CLR_STR "\n", strerror(errno));
return 1;
@ -93,15 +87,20 @@ int main(int argc, const char *argv[]) {
for (int i = 0; i < NUM_SOCKETS; i++) {
if (FD_ISSET(SOCKETS[i], &read_socket_fds)) {
pid_t child = client_handler(SOCKETS[i]);
if (child == 0) {
return 0;
} else if (child > 0) {
pid_t pid = fork();
if (pid == 0) {
// child
return client_handler(SOCKETS[i], client_num);
} else if (pid > 0) {
// parent
client_num++;
for (int j = 0; j < MAX_CHILDREN; j++) {
if (CHILDREN[j] == 0) {
CHILDREN[j] = child;
CHILDREN[j] = pid;
}
}
} else {
fprintf(stderr, ERR_STR "Unable to create child process: %s" CLR_STR "\n", strerror(errno));
}
}
}