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¶m2=value2\r\n",
REQUEST_PATH, strlen("param1=value1¶m2=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.