多进程
#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 5
void 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 descriptor
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// Set socket options to allow multiple connections
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT,
&opt, sizeof(opt))) {
perror("setsockopt");
exit(EXIT_FAILURE);
}
// Initialize address structure
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
// Bind the socket to localhost and port
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// Listen for incoming connections
if (listen(server_fd, MAX_CLIENTS) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
printf("Server listening on port %d\n", PORT);
while (1) {
// Accept incoming connection
if ((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 client
pid_t pid = fork();
if (pid == 0) { // Child process
close(server_fd); // Close server socket in child
handle_client(client_socket);
exit(0); // Exit child process after handling client
} else if (pid < 0) { // Fork failed
perror("fork");
exit(EXIT_FAILURE);
} else { // Parent process
close(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 5
void *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 argument
pthread_exit(NULL);
}
int main() {
int server_fd, client_socket;
struct sockaddr_in address;
int addrlen = sizeof(address);
// Create socket file descriptor
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// Initialize address structure
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
// Bind the socket to localhost and port
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// Listen for incoming connections
if (listen(server_fd, MAX_CLIENTS) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
printf("Server listening on port %d\n", PORT);
while (1) {
// Accept incoming connection
if ((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 descriptor
int *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 client
pthread_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 reclaimed
pthread_detach(thread_id);
}
return 0;
}