Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!

#define лучше более логичным static const string заменить.
Страуструп вообще не рекомендует использовать дефайны там, где можно обойтись без них
#include <iostream>
#include <array>
#include <string>
using namespace std;
constexpr int foo()
{
return 5;
}
class conststr {
const char * p;
size_t sz;
public:
template<size_t N>
constexpr conststr(const char(&a)[N]) : p(a), sz(N-1) {}
constexpr char operator[](size_t n) const {
return n < sz ? p[n] : throw out_of_range("");
}
constexpr size_t size() const { return sz; }
};
static const string g_static_const_str = "g456abc";
constexpr conststr g_constexpr_str = "123fgtr";
int main()
{
array<int, foo()> a1;
array<int, g_constexpr_str.size()> a2;
array<int, g_static_const_str.size()> a3;
cout << "ok" << endl;
return 0;
}
$g++ -std=c++11 main.cpp -o demo -lm -pthread -lgmpxx -lgmp -lreadline 2>&1
main.cpp: In function ‘int main()’:
main.cpp:32:26: error: call to non-constexpr function ‘std::basic_string<_CharT, _Traits, _Alloc>::size_type std::basic_string<_CharT, _Traits, _Alloc>::size() const [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::basic_string<_CharT, _Traits, _Alloc>::size_type = long unsigned int]’
array<int, g_str.size()> a3;
^
main.cpp:32:26: error: call to non-constexpr function ‘std::basic_string<_CharT, _Traits, _Alloc>::size_type std::basic_string<_CharT, _Traits, _Alloc>::size() const [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::basic_string<_CharT, _Traits, _Alloc>::size_type = long unsigned int]’
main.cpp:32:27: note: in template argument for type ‘long unsigned int’
array<int, g_str.size()> a3;
^
main.cpp:32:31: error: invalid type in declaration before ‘;’ token
array<int, g_str.size()> a3;
^
[listen_sd](const char on){
setsockopt(listen_sd, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof(on));
setsockopt(listen_sd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
}(1);
{
const char on = 1;
setsockopt(listen_sd, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof(on));
setsockopt(listen_sd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
}
double a = 5.0;
double b = 10.0;
int count = std::count_if(std::begin(v), std::end(v), [a, b](double x){return x > a && x < b;});
А чем ваш велосипед (я про server.h) лучше, чем, например, boost.asio?
telnet unblok.us 8085
Trying 54.204.33.57...
Connected to unblok.us (54.204.33.57).
Escape character is '^]'.
GET /../ca-cert.pem
HTTP/1.1 200 OK
Content-Length: 1953
-----BEGIN CERTIFICATE-----
MIIC5TCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQQFADBcMQswCQYDVQQGEwJBVTET
MBEGA1UECBMKUXVlZW5zbGFuZDEaMBgGA1UEChMRQ3J5cHRTb2Z0IFB0eSBMdGQx
HDAaBgNVBAMTE1Rlc3QgUENBICgxMDI0IGJpdCkwHhcNOTkxMjAyMjEzODUxWhcN
MDUwNzEwMjEzODUxWjBbMQswCQYDVQQGEwJBVTETMBEGA1UECBMKUXVlZW5zbGFu
ZDEaMBgGA1UEChMRQ3J5cHRTb2Z0IFB0eSBMdGQxGzAZBgNVBAMTElRlc3QgQ0Eg
KDEwMjQgYml0KTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAo7ujy3XXpU/p
yDJtOxkMJmGv3mdiVm7JrdoKLUgqjO2rBaeNuYMUiuI6oYU+tlD6agwRML0Pn2JF
b90VdK/UXrmRr9djaEuH17EIKjte5RwOzndCndsjcCYyoeODMTyg7dqPIkDMmRNM
5R5xBTabD+Aji0wzQupYxBLuW5PLj7ECAwEAAaOBtzCBtDAdBgNVHQ4EFgQU1WWA
U42mkhi3ecgey1dsJjU61+UwgYQGA1UdIwR9MHuAFE0RaEcrj18q1dw+G6nJbsTW
R213oWCkXjBcMQswCQYDVQQGEwJBVTETMBEGA1UECBMKUXVlZW5zbGFuZDEaMBgG
A1UEChMRQ3J5cHRTb2Z0IFB0eSBMdGQxHDAaBgNVBAMTE1Rlc3QgUENBICgxMDI0
IGJpdCmCAQAwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQBb39BRphHL
6aRAQyymsvBvPSCiG9+kR0R1L23aTpNbhXp2BebyFjbEQYZc2kWGiKKcHkNECA35
3d4LoqUlVey8DFyafOIJd9hxdZfg+rxlHMxnL7uCJRmx9+xB411Jtsol9/wg1uCK
sleGpgB4j8cG2SVCz7V2MNZNK+d5QCnR7A==
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQCju6PLddelT+nIMm07GQwmYa/eZ2JWbsmt2gotSCqM7asFp425
gxSK4jqhhT62UPpqDBEwvQ+fYkVv3RV0r9ReuZGv12NoS4fXsQgqO17lHA7Od0Kd
2yNwJjKh44MxPKDt2o8iQMyZE0zlHnEFNpsP4COLTDNC6ljEEu5bk8uPsQIDAQAB
AoGAVZmpFZsDZfr0l2S9tLLwpjRWNOlKATQkno6q2WesT0eGLQufTciY+c8ypfU6
hyio8r5iUl/VhhdjhAtKx1mRpiotftHo/eYf8rtsrnprOnWG0bWjLjtIoMbcxGn2
J3bN6LJmbJMjDs0eJ3KnTu646F3nDUw2oGAwmpzKXA1KAP0CQQDRvQhxk2D3Pehs
HvG665u2pB5ipYQngEFlZO7RHJZzJOZEWSLuuMqaF/7pTfA5jiBvWqCgJeCRRInL
21ru4dlPAkEAx9jj7BgKn5TYnMoBSSe0afjsV9oApVpN1Nacb1YDtCwy+scp3++s
nFxlv98wxIlSdpwMUn+AUWfjiWR7Tu/G/wJBAJ/KjwZIrFVxewP0x2ILYsTRYLzz
MS4PDsO7FB+I0i7DbBOifXS2oNSpd3I0CNMwrxFnUHzynpbOStVfN3ZL5w0CQQCa
pwFahxBRhkJKsxhjoFJBX9yl75JoY4Wvm5Tbo9ih6UJaRx3kqfkN14L2BKYcsZgb
KY9vmDOYy6iNfjDeWTfJAkBkfPUb8oTJ/nSP5zN6sqGxSY4krc4xLxpRmxoJ8HL2
XfhqXkTzbU13RX9JJ/NZ8vQN9Vm2NhxRGJocQkmcdVtJ
-----END RSA PRIVATE KEY-----
Connection closed by foreign host.
Эта фраза была актуальна лет десять назад, может быть, но не сейчас. Опять же, какой размер лучше — тот, что меньше, или тот, что больше? Размер чего мы сравниваем? Исходного кода? Получившегося приложения? Головной боли по поддержке кода?
Если необходимо разобраться только в http_server.h — возможно.
Однако класс CServer в заголовочный файл не входит, и в нем надо тоже долго разбираться.
Что именно вас не устраивало в Boost.Asio
Для таких целей есть = delete
private:
CClient(const CClient &);
//Добавляем в начало ответа http заголовок
std::ostringstream strStream;
strStream <<
"HTTP/1.1 200 OK\r\n"
<< "Content-Length: " << m_nFileSize << "\r\n" <<
"\r\n";
//Запоминаем заголовок
pvBuffer->resize(strStream.str().length());
memcpy(&pvBuffer->at(0), strStream.str().c_str(), strStream.str().length());
map<string, string> m_mapHeader;
enum Type
{
METHOD,
PATH,
}
map<Type, string> m_mapHeader;
memcpy тут логичнее заменить на std::move, а тормозной std::ostringstream на std::string.
зачем shared_ptr а не unique_ptr
надо сделать ключом строку необходимо использовать unordered_map
ведь http текстовый протокол
В комментариях к предыдущим моим статьям мне убедительно доказали, что для компилятора std::memcpy и std::copy — одно и тоже.
Для буфера также удобно использовать именно объект вектор — так не нужно везде еще и размер передавать.
Нет. По нему можно и двоичные данные передавать тоже.
там канал такой плохой или оно дико медленное
Самый короткий веб-сервер на с++