Untitled
unknown
plain_text
2 years ago
3.2 kB
6
Indexable
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <pthread.h> #define BUFFER_SIZE 1024 #define MAX_CLIENTS 5 void *client_handler(void *); int main() { int server_socket, client_socket, port; char buffer[BUFFER_SIZE]; struct sockaddr_in server_addr, client_addr; socklen_t client_addr_len; pthread_t threads[MAX_CLIENTS]; int thread_count = 0; printf("Enter port number: "); scanf("%d", &port); // create server socket server_socket = socket(AF_INET, SOCK_STREAM, 0); if (server_socket < 0) { perror("socket creation failed"); exit(EXIT_FAILURE); } // set server address and port memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_port = htons(port); // bind server socket to address and port if (bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } // listen for incoming connections if (listen(server_socket, MAX_CLIENTS) < 0) { perror("listen failed"); exit(EXIT_FAILURE); } // print server address and port printf("Server listening on %s:%d\n", inet_ntoa(server_addr.sin_addr), ntohs(server_addr.sin_port)); // accept incoming connections and spawn client threads while (1) { client_addr_len = sizeof(client_addr); client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &client_addr_len); if (client_socket < 0) { perror("accept failed"); break; } printf("Client connected from %s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); if (pthread_create(&threads[thread_count], NULL, client_handler, (void *)&client_socket) != 0) { perror("thread creation failed"); break; } thread_count++; if (thread_count >= MAX_CLIENTS) { printf("Maximum number of clients reached\n"); break; } } // join client threads and exit for (int i = 0; i < thread_count; i++) { pthread_join(threads[i], NULL); } close(server_socket); exit(EXIT_SUCCESS); } void *client_handler(void *arg) { int client_socket = *(int *)arg; char buffer[BUFFER_SIZE]; pthread_t self = pthread_self(); // receive and print client strings until client disconnects or types "quit" while (1) { memset(buffer, 0, sizeof(buffer)); if (read(STDIN_FILENO, buffer, BUFFER_SIZE) < 0) { perror("read failed"); break; } if (send(client_socket, buffer, strlen(buffer), 0) < 0) { perror("send failed"); break; } if (strcmp(buffer, "quit\n") == 0) { break; } } // close client socket and exit thread close(client_socket); printf("Thread %lu exiting\n", self); return NULL; }
Editor is loading...