1.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 8080
#define BUFFER_SIZE 1024
// 处理客户端连接的函数
void *handle_client(void *socket_desc) {
int sock = *(int*)socket_desc;
char buffer[BUFFER_SIZE];
read(sock, buffer, BUFFER_SIZE);
printf("Received: %s\n", buffer);
// 发送响应给客户端
const char *msg = "Hello from server";
send(sock, msg, strlen(msg), 0);
close(sock);
free(socket_desc);
return 0;
}
int main(int argc, char *argv[]) {
int server_fd, new_socket;
struct sockaddr_in address;
int addrlen = sizeof(address);
pthread_t thread_id;
// 创建socket
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// 定义sockaddr_in结构
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
// 绑定socket
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// 监听socket
if (listen(server_fd, 3) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
// 接受连接
while (1) {
new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen);
if (new_socket < 0) {
perror("accept");
continue;
}
// 创建线程来处理客户端请求
int *pclient = malloc(1);
*pclient = new_socket;
if (pthread_create(&thread_id, NULL, handle_client, (void*)pclient) != 0) {
perror("could not create thread");
return 1;
}
}
return 0;
}
2.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#define PORT 8080
#define BUFFER_SIZE 1024
// 处理客户端连接的函数
void handle_client(int sock) {
char buffer[BUFFER_SIZE];
// 读取客户端发送的数据
read(sock, buffer, BUFFER_SIZE);
printf("Received: %s\n", buffer);
// 发送响应给客户端
const char *msg = "Hello from server";
write(sock, msg, strlen(msg));
close(sock);
}
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
// 创建socket
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// 设置socket选项,允许地址重用
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
perror("setsockopt");
exit(EXIT_FAILURE);
}
// 定义sockaddr_in结构
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
// 绑定socket
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// 监听socket
if (listen(server_fd, 3) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
printf("Listening on port %d...\n", PORT);
// 接受连接
while (1) {
new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen);
if (new_socket < 0) {
perror("accept");
continue;
}
// 创建子进程来处理客户端请求
pid_t pid = fork();
if (pid == 0) { // 子进程
close(server_fd); // 子进程不需要监听socket
handle_client(new_socket);
exit(0); // 子进程处理完毕后退出
} else if (pid < 0) {
perror("fork");
exit(EXIT_FAILURE);
} else {
close(new_socket); // 父进程关闭新socket
}
}
return 0;
}