Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 03.09.2017
Сообщений: 6

проблемы в Опере с post запросами и ответами

17.05.2021, 00:08. Показов 1364. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Столкнулся с проблемой сделал http сервер на основе статьи "Веб-сервер на C++ и сокетах",
но столкнулся с проблемой не работают POST запросы в браузере Opera, на сервер приходит по три запроса с пустым телом, а в браузере пишет что сервер не отвечает, хотя с GET проблем нет и в других браузерах всё работает и get, и post.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.05.2021, 00:08
Ответы с готовыми решениями:

Проблемы с ответами
Добрый день! Возникли трудности с ответами, помогите пожалуйста, 1) В чём основная цель (назначение) default constructor? a)...

Проблемы с ответами
Please, помогите с ответами: Question 1/ A character array terminated with the null character is most correctly called Question 1...

Спам POST запросами
Приветствую. На хостинге timeweb есть 2 сайта. Все было нормально, но неожиданно сильно подскочила нагрузка. в логах нашел большое...

7
Native x86
Эксперт Hardware
 Аватар для quwy
6853 / 3787 / 1024
Регистрация: 13.02.2013
Сообщений: 11,861
17.05.2021, 01:15
Вам с браузером нужен арбитр в виде сниффера. Установите какой-нибудь WireShark и смотрите, что там реально по сети бегает.
0
0 / 0 / 0
Регистрация: 03.09.2017
Сообщений: 6
17.05.2021, 10:48  [ТС]
Запросы до сервера доходят, только с пустым телом.
И если после отправки ответа клиенту вывести любой текст в консоль через cout, то браузер не разрывает соединение и пост приходит один, но с пустым телом.
Вечером доберусь до компа выложу код, может кто поймет что я там на городил))
0
0 / 0 / 0
Регистрация: 03.09.2017
Сообщений: 6
17.05.2021, 22:15  [ТС]
Server.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#pragma once
#include <iostream>
#include <sstream>
#include <WinSock2.h>
#include <WS2tcpip.h>
 
#include "data.h"
 
class Server {
public: 
    Server();
    ~Server();
 
    void run();
 
    int stopServer();
    void setFlag(bool);
    std::string getError(); 
    std::string linkServer();
 
private:
    WSADATA wsaData;
    struct addrinfo* addr = NULL;
    struct addrinfo hints;
    int listen_socket;
    PCSTR ipServer;
    PCSTR portServer;
    bool flag;
    std::string msgError;
 
    int ws2load();
    int initAddressStruct();
    int createSocket();
    int bindSocket();
    int initSocket();
    
};
Server.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#include "server.h"
 
#pragma comment(lib, "Ws2_32.lib")
 
 
Server::~Server() {
 
}
 
Server::Server(){
    ZeroMemory(&hints, sizeof(hints));
 
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    hints.ai_flags = AI_PASSIVE;
 
    ipServer = "192.168.1.196";
    portServer = "80";
 
    flag = false;
 
    msgError = "default";
    
}
 
int Server::ws2load() {
    int result = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (result != 0) {
        this->msgError = "WSAStartup failed: " + result;
        return result;
    }
    return 0;
}
 
int Server::initAddressStruct() {
    int result = getaddrinfo(ipServer, portServer, &hints, &addr);
    if (result != 0) {    
        this->msgError = "Getaddrinfo failed: " + result;
        WSACleanup(); // выгрузка библиотеки Ws2_32.dll
        return result;
    }
    return 0;
}
 
int Server::createSocket() {
    listen_socket = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
    if (listen_socket == INVALID_SOCKET) {
        this->msgError = "Error at socket";
        freeaddrinfo(addr);
        WSACleanup();
        return 1;
    }
    return 0;
}
 
int Server::bindSocket() {
    int result = bind(listen_socket, addr->ai_addr, (int)addr->ai_addrlen);
    if (result == SOCKET_ERROR) {
        this->msgError = "bind failed with error";
        freeaddrinfo(addr);
        closesocket(listen_socket);
        WSACleanup();
        return 1;
    }
    return 0;
}
 
int Server::initSocket() {
    if (listen(listen_socket, SOMAXCONN) == SOCKET_ERROR) {
        this->msgError = "listen failed with error" ;
        closesocket(listen_socket);
        WSACleanup();
        return 1;
    }
    return 0;
}
 
void Server::setFlag(bool fl) { this->flag = fl; }
 
std::string Server::getError() {
    return this->msgError;
}
 
 
std::string Server::linkServer() {
    return "http://" + std::string(this->ipServer) + ":" + std::string(this->portServer);
}
 
int Server::stopServer() {
    return closesocket(this->listen_socket);
}
 
void Server::run() {
    if (ws2load() != 0) { std::cout << msgError << std::endl; return; }
    if (initAddressStruct() != 0) { std::cout << msgError << std::endl; return; }
    if (createSocket() != 0) { std::cout << msgError << std::endl; return; }
    if (bindSocket() != 0) { std::cout << msgError << std::endl; return; }
    if (initSocket() != 0) { std::cout << msgError << std::endl; return; }
 
    const int max_client_buffer_size = 1024;
    char buff[max_client_buffer_size];
    memset(buff, 0, max_client_buffer_size);
    int client_socket = INVALID_SOCKET;
    while (flag) {
        
        // Принимаем входящие соединения
        client_socket = accept(listen_socket, NULL, NULL);
        if (client_socket == INVALID_SOCKET) {
            msgError = "accept failed";
            closesocket(listen_socket);
            WSACleanup();
            break;
        }
 
        int result = recv(client_socket, buff, max_client_buffer_size, 0);
 
        std::cout << buff << std::endl;
 
 
    
 
        if (result == SOCKET_ERROR) {
            // ошибка получения данных
            std::cout << "recv failed: " << result << "\n";
            closesocket(client_socket);
        }
        else if (result == 0) {
            // соединение закрыто клиентом
            std::cout << "connection closed...\n";
        }
        else if (result > 0) {
            memset(buff, 0, max_client_buffer_size);
            // Данные успешно получены
            // формируем тело ответа (HTML)
    
            std::string response;
            response = HTTP::Response::_200_(HTML::testHTML.length()) + HTML::testHTML;
            // Отправляем ответ клиенту с помощью функции send
            result = send(client_socket, response.c_str(), response.length(), 0);
            if (result == SOCKET_ERROR) {
                // произошла ошибка при отправле данных
                std::cout << "send failed\n";
            }
            
            closesocket(client_socket);
        }
    }
 
    closesocket(listen_socket);
    freeaddrinfo(addr);
    WSACleanup();
 
}
data.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#pragma once
#include <string>
 
namespace HTML {
    const std::string testHTML = 
        "<html>\n"
        "<head>\n"
        "<title>Test HTTP Server</title>\n"
                "</head>
        "<body>\n"
        "<h1>Test page</h1>\n"
        "<p>This is body of the test page...</p>\n"
        "<em><small>Test C++ Http Server</small></em>\n"
        "<form method=\"POST\" action=\"\">\n"
        "<input name = \"fname\" type = \"text\" value = \"\"></br>\n"
        "<input type = \"submit\" value = \"send\">\n"
        "</form>\n"
        "</body></html>";
                                 
 
}
 
namespace HTTP {
    namespace Response {
        std::string _200_(int ContentLength);
    }
}
P.S. я понимаю что это говнокод, но я только учусь
0
0 / 0 / 0
Регистрация: 03.09.2017
Сообщений: 6
17.05.2021, 22:26  [ТС]
зеленым обведены пакеты из Edge

из Оперы красным: первые 2 круга после первого нажатия на send , остальное после повторного
Миниатюры
проблемы в Опере с post запросами и ответами  
0
Native x86
Эксперт Hardware
 Аватар для quwy
6853 / 3787 / 1024
Регистрация: 13.02.2013
Сообщений: 11,861
23.05.2021, 00:42
Круто. Раз даже сниффер показывает обрубок, то дело не а коде вашего http-сервера, а в коде страницы, на которой POST-форма. Конкретно тут, вижу, даже подсветка съехала из-за проблем с кавычками. Уж не в этом ли дело?
0
0 / 0 / 0
Регистрация: 03.09.2017
Сообщений: 6
23.05.2021, 09:56  [ТС]
Оказалось для оперы, надо два раза функцую recv() использовать, она запрос на две части делит, в отличие от всех других браузеров
0
Native x86
Эксперт Hardware
 Аватар для quwy
6853 / 3787 / 1024
Регистрация: 13.02.2013
Сообщений: 11,861
24.05.2021, 00:56
Эхех... Сколько открытий чудных вас ждет. Запомните: любой переданный по TCP/IP блок данных по пути к приемной стороне может развалиться на несколько кусков, которые прилетят с паузами непредсказуемой ширины. И ваш код должен быть готов к этому всегда.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.05.2021, 00:56
Помогаю со студенческими работами здесь

Работа с post/get запросами
Всем привет, знаю, подобными запросами уже кишит этот сайт, но я никак не могу найти полноценны Добавлено через 8 минут Всем привет,...

работа с post/get запросами
Добрый день всем. нужна ваша помощь .. необходимо написать программу, которая бы отправляла методом пост логин/пароль на сторонний...

Логика авторизации POST запросами
Здравствуйте, не могу понять логику отправки POST запросов. К примеру есть скрипт авторизации на почте gmail. Вот он отправляет логин и...

Access_log забит левыми GET,POST запросами
Помогите , пожалуйста как защититься от брутфорсеров. У меня внешний apache centos и proxypass на внутренний iis. &lt;VirtualHost...

Создание таблицы и заполнение ее post/get запросами
Моя задача транслировать смс с модема на сайт. Все уже готово, только осталось сделать сайт с табличкой 3 столбика формат таблицы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru