Frod

08.09.2026

linux c си сокет как прокси

Frod — свобода без границ

Linux C Си: socket как прокси-сервер

В экосистеме информационной безопасности (infosec) и сетевой программирования Linux C Си является популярным языком для реализации высокопроизводительных и безопасных сетевых приложений. В этом очерке мы рассмотрим реализацию простого прокси-сервера на основе сокетов (Linux C Си socket как прокси-сервер).

Начало работы

Для начала, нам понадобится компилятор GCC (GNU Compiler Collection) и библиотека Linux C Си socket. Мы будем использовать версию GCC 9.x и выше, а также библиотеку Linux C Си socket версии 4.x и выше.

sudo apt-get update
sudo apt-get install gcc
sudo apt-get install libssl-dev

Принцип работы

Прокси-сервер представляет собой программное средство, которое принимает входящий запрос клиента и перенаправляет его на другой сервер, который содержит нужные данные. В этом случае мы будем использовать Linux C Си socket как основу для реализации простого прокси-сервера.

Порядок действий

  1. Создание сокета: Создайте сокет, используя функцию socket() из библиотеки Linux C Си socket. Этот сокет будет использоваться для обмена данными между клиентом и сервером.

```c
#include
#include
#include
#include
#include
#include

int main() {
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("socket error");
exit(EXIT_FAILURE);
}
...
}
```

  1. Регистрация сокета: Регистрируйте сокет на системе, используя функцию bind() из библиотеки Linux C Си socket. Этот шаг необходим для привязки сокета к конкретному адресу и порту.

```c
struct sockaddr_in serv_addr;
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(8080);
inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr);

if (bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
perror("bind error");
exit(EXIT_FAILURE);
}
```

  1. Слушание сокета: Слушайте за входящим соединением на сокете, используя функцию listen() из библиотеки Linux C Си socket. Этот шаг необходим для того, чтобы сокет начинал принимать входящие соединения.

c if (listen(sockfd, 3) < 0) { perror("listen error"); exit(EXIT_FAILURE); }

  1. Обработка соединения: Обрабатывайте входящее соединение, используя функцию accept() из библиотеки Linux C Си socket. Этот шаг необходим для того, чтобы принять входящее соединение и создать новый сокет для обмена данными.

c int new_fd = accept(sockfd, (struct sockaddr *)&clnt_addr, &clnt_len); if (new_fd < 0) { perror("accept error"); exit(EXIT_FAILURE); }

  1. Обмен данными: Обменивайтесь данными с клиентом, используя новый сокет, созданный в предыдущем шаге.

c char buffer[256]; int n = read(new_fd, buffer, 256); if (n < 0) { perror("read error"); exit(EXIT_FAILURE); } printf("%s", buffer);

Полный код

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define MAXPENDING 5
#define BUFFER_SIZE 256

int main() {
 int sockfd, new_fd, clnt_len;
 struct sockaddr_in serv_addr, clnt_addr;
 char buffer[BUFFER_SIZE];

 // Создание сокета
 sockfd = socket(AF_INET, SOCK_STREAM, 0);
 if (sockfd < 0) {
 perror("socket error");
 exit(EXIT_FAILURE);
 }

 // Регистрация сокета
 serv_addr.sin_family = AF_INET;
 serv_addr.sin_port = htons(8080);
 inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr);

 if (bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
 perror("bind error");
 exit(EXIT_FAILURE);
 }

 // Слушание сокета
 if (listen(sockfd, MAXPENDING) < 0) {
 perror("listen error");
 exit(EXIT_FAILURE);
 }

 printf("Сервер готов к работе...\n");

 while (1) {
 // Обработка соединения
 clnt_len = sizeof(clnt_addr);
 new_fd = accept(sockfd, (struct sockaddr *)&clnt_addr, &clnt_len);
 if (new_fd < 0) {
 perror("accept error");
 exit(EXIT_FAILURE);
 }

 printf("Соединение установлено с клиентом IP address %s, порт %d\n",
 inet_ntoa(clnt_addr.sin_addr), ntohs(clnt_addr.sin_port));

 // Обмен данными
 char message[] = "Привет, клиент!";
 send(new_fd, message, strlen(message), 0);
 int n = read(new_fd, buffer, BUFFER_SIZE);
 if (n < 0) {
 perror("read error");
 exit(EXIT_FAILURE);
 }
 printf("%s", buffer);

 close(new_fd);
 }

 return 0;
}

Контроль ошибок

В этом примере мы использовали функцию perror() для вывода ошибок. Эта функция выводит строку ошибки и номер ошибки, что поможет вам определить причину ошибки.

Вывод

В этом очерке мы рассмотрели реализацию простого прокси-сервера на основе сокетов (Linux C Си socket как прокси-сервер). Мы показали, как создать сокет, регистрировать его, слушать входящее соединение и обмениваться данными с клиентом. Этот пример поможет вам понять принципы работы прокси-сервера и реализовать простую версию прокси-сервера в Linux C Си.