多进程
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>#define PORT 8080
#define MAX_CLIENTS 5void handle_client(int client_socket) {char buffer[1024] = {0};int valread;valread = read(client_socket, buffer, 1024);printf("Received message from client: %s\n", buffer);send(client_socket, buffer, strlen(buffer), 0);printf("Response sent to client\n");close(client_socket);
}int main() {int server_fd, client_socket, opt = 1;struct sockaddr_in address;int addrlen = sizeof(address);// Create socket file descriptorif ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {perror("socket failed");exit(EXIT_FAILURE);}// Set socket options to allow multiple connectionsif (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT,&opt, sizeof(opt))) {perror("setsockopt");exit(EXIT_FAILURE);}// Initialize address structureaddress.sin_family = AF_INET;address.sin_addr.s_addr = INADDR_ANY;address.sin_port = htons(PORT);// Bind the socket to localhost and portif (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {perror("bind failed");exit(EXIT_FAILURE);}// Listen for incoming connectionsif (listen(server_fd, MAX_CLIENTS) < 0) {perror("listen");exit(EXIT_FAILURE);}printf("Server listening on port %d\n", PORT);while (1) {// Accept incoming connectionif ((client_socket = accept(server_fd, (struct sockaddr *)&address,(socklen_t*)&addrlen)) < 0) {perror("accept");exit(EXIT_FAILURE);}printf("New client connected\n");// Fork a new process to handle clientpid_t pid = fork();if (pid == 0) { // Child processclose(server_fd); // Close server socket in childhandle_client(client_socket);exit(0); // Exit child process after handling client} else if (pid < 0) { // Fork failedperror("fork");exit(EXIT_FAILURE);} else { // Parent processclose(client_socket); // Close client socket in parent}}return 0;
}
多线程
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>#define PORT 8080
#define MAX_CLIENTS 5void *handle_client(void *arg) {int client_socket = *((int *)arg);char buffer[1024] = {0};int valread;valread = read(client_socket, buffer, 1024);printf("Received message from client: %s\n", buffer);send(client_socket, buffer, strlen(buffer), 0);printf("Response sent to client\n");close(client_socket);free(arg); // Free memory allocated for argumentpthread_exit(NULL);
}int main() {int server_fd, client_socket;struct sockaddr_in address;int addrlen = sizeof(address);// Create socket file descriptorif ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {perror("socket failed");exit(EXIT_FAILURE);}// Initialize address structureaddress.sin_family = AF_INET;address.sin_addr.s_addr = INADDR_ANY;address.sin_port = htons(PORT);// Bind the socket to localhost and portif (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {perror("bind failed");exit(EXIT_FAILURE);}// Listen for incoming connectionsif (listen(server_fd, MAX_CLIENTS) < 0) {perror("listen");exit(EXIT_FAILURE);}printf("Server listening on port %d\n", PORT);while (1) {// Accept incoming connectionif ((client_socket = accept(server_fd, (struct sockaddr *)&address,(socklen_t*)&addrlen)) < 0) {perror("accept");exit(EXIT_FAILURE);}printf("New client connected\n");// Allocate memory for client socket descriptorint *client_sock_ptr = (int *)malloc(sizeof(int));if (client_sock_ptr == NULL) {perror("malloc");exit(EXIT_FAILURE);}*client_sock_ptr = client_socket;// Create a new thread to handle clientpthread_t thread_id;if (pthread_create(&thread_id, NULL, handle_client, (void *)client_sock_ptr) < 0) {perror("pthread_create");exit(EXIT_FAILURE);}// Detach the thread so its resources are automatically reclaimedpthread_detach(thread_id);}return 0;
}