У меня есть программа python, с которой я хочу связаться с программой C через http. Я использую запросы в python для отправки некоторых json данных в сокет в C.
Иногда python выдает ошибку «сброс соединения по одноранговой сети», и я не могу понять это. Когда я получаю эту ошибку, программа C отправляет и получает все содержимое, кроме содержимого запроса. В моем приложении я также делаю запросы от клиента, написанного в Go. С этим клиентом я никогда не получаю эти ошибки, поэтому я думаю, что мне не хватает какой-то конфигурации или простого решения в библиотеке запросов. Почему это происходит и что может решить мою проблему?
Вот простой пример; Я не очень знаком с сокетами:
Сервер C:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define RECV_BUF_SIZE 1024
int main(void)
{
struct sockaddr_in serv_addr, cli_addr;
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(8080);
int option = 1;
int socketfd = socket(AF_INET, SOCK_STREAM, 0);
setsockopt(socketfd, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option));
if (socketfd < 0)
{
perror("failed to start socket");
exit(1);
}
if (bind(socketfd, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) < 0)
{
perror("failed to bind");
exit(1);
}
if (listen(socketfd, 1000) != 0)
{
perror("listen error");
exit(1);
}
char buf[RECV_BUF_SIZE];
while (1)
{
int addrlen = sizeof(cli_addr);
int clientfd = accept(socketfd, (struct sockaddr*) &cli_addr, &addrlen);
if (clientfd < 0)
{
perror("accept error");
}
else
{
int n_recv = recv(clientfd, buf, RECV_BUF_SIZE, 0);
// print everything, character by character.
char* tmp_buf = buf;
while (n_recv--) printf("%c", *tmp_buf++);
printf("\n\n****************************\n\n");
FILE* res = fdopen(clientfd, "w");
fprintf(res, "HTTP/1.1 200 OK\r\n\r\n");
fclose(res);
shutdown(clientfd, SHUT_RDWR);
close(clientfd);
}
}
}
Сценарий запроса Python:
import requests
json_data = {
"hello": "thanks"
}
requests.post("http://localhost:8080", json=json_data)
Спасибо вам! * * 1013