/
bvs22
/
draft
Обзор
Документация
Войти
/
bvs22
/
draft
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
network/servers/parallel_servers.c
122 строки
2 KB
Batomunkuev Vladimir
1
17 фев 2025, 08:48
17 фев 2025, 08:48
7478e9f
Код
Авторство
О чём код?
#include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <arpa/inet.h> #include <sys/socket.h> #include <pthread.h> #include <sys/signal.h> #define PORT_SERVER 7777 int socket_fd = -1; void clean(int signal) { if (socket_fd != -1) { close(socket_fd); } printf("\n"); exit(0); } void *handle_client(void *arg) { int new_socket = *((int *)arg); ssize_t byte_in; char *msg = "Hello client!"; char buffer[256] = {0}; if ((byte_in = recv(new_socket, buffer, sizeof(buffer) - 1, 0)) == -1) { perror("recv"); close(new_socket); close(socket_fd); exit(1); } buffer[byte_in] = '\0'; printf("%s\n", buffer); if (send(new_socket, msg, strlen(msg), 0) == -1) { perror("send"); close(new_socket); close(socket_fd); exit(1); } close(new_socket); return 0; } int main() { struct sockaddr_in server_add, client_add; int new_socket; int *p_new_socket; int add_len = sizeof(client_add); pthread_t thread_id; signal(SIGINT, clean); if ((socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); return 1; } memset(&server_add, 0, add_len); server_add.sin_family = AF_INET; server_add.sin_addr.s_addr = INADDR_ANY; server_add.sin_port = htons(PORT_SERVER); if (bind(socket_fd, (struct sockaddr *)&server_add, add_len) == -1) { perror("bind"); close(socket_fd); return 1; } if (listen(socket_fd, 5) == -1) { perror("listen"); close(socket_fd); return 1; } while (1) { if ((new_socket = accept(socket_fd, (struct sockaddr *)&client_add, (socklen_t *)&add_len)) == -1) { perror("accept"); close(socket_fd); return 1; } if ((p_new_socket = malloc(sizeof(int))) == NULL) { perror("malloc"); close(socket_fd); return 1; } *p_new_socket = new_socket; if (pthread_create(&thread_id, NULL, handle_client, p_new_socket) != 0) { perror("pthread_creat"); close(new_socket); close(socket_fd); return 1; } } close(socket_fd); return 0; }