post запрос на СИ без использования библиотек

Выполнение HTTP-запросов без использования внешних библиотек на языке Си требует ручного формирования сетевых пакетов и работы с сокетами. Это довольно сложная задача, но вот пример, который демонстрирует, как это можно сделать для POST-запроса: 1. Убедитесь, что у вас установлены необходимые заголовочные файлы и библиотеки для работы с сокетами. На большинстве Unix-подобных систем это уже доступно по умолчанию. 2. Создайте файл с исходным кодом, например `post_request_raw.c`, и добавьте в него следующий код: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #define SERVER_IP "93.184.216.34" // IP-адрес example.com #define SERVER_PORT 80 #define REQUEST_PATH "/" int main() { int sock; struct sockaddr_in server; char request[256]; char response[4096]; // Создание сокета sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == -1) { perror("Could not create socket"); return 1; } // Настройка сервера server.sin_addr.s_addr = inet_addr(SERVER_IP); server.sin_family = AF_INET; server.sin_port = htons(SERVER_PORT); // Подключение к серверу if (connect(sock, (struct sockaddr *)&server, sizeof(server)) < 0) { perror("Connect failed"); close(sock); return 1; } // Формирование POST-запроса snprintf(request, sizeof(request), "POST %s HTTP/1.1\r\n" "Host: example.com\r\n" "Content-Type: application/x-www-form-urlencoded\r\n" "Content-Length: %lu\r\n" "Connection: close\r\n" "\r\n" "param1=value1&param2=value2\r\n", REQUEST_PATH, strlen("param1=value1&param2=value2")); // Отправка запроса if (send(sock, request, strlen(request), 0) < 0) { perror("Send failed"); close(sock); return 1; } // Получение ответа int total_received = 0; while (total_received < sizeof(response) - 1) { int received = recv(sock, response + total_received, sizeof(response) - 1 - total_received, 0); if (received <= 0) { break; } total_received += received; } response[total_received] = '\0'; // Вывод ответа printf("Response:\n%s\n", response); // Закрытие сокета close(sock); return 0; } ``` 3. Скомпилируйте программу с помощью `gcc`: ```sh gcc -o post_request_raw post_request_raw.c ``` 4. Запустите скомпилированную программу: ```sh ./post_request_raw ``` Этот пример кода создает TCP-сокет, подключается к серверу `example.com` на порту 80, формирует и отправляет POST-запрос, а затем получает и выводит ответ от сервера. Обратите внимание, что в этом примере используется IP-адрес `example.com` (`93.184.216.34`). В реальном приложении вам может понадобиться разрешить доменное имя в IP-адрес с помощью функции `getaddrinfo`. Также, для работы с HTTPS потребуется более сложная обработка, включая SSL/TLS.