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

Сокеты. Отправка GET-запроса по HTTPS и получение ответа от сервера

26.12.2015, 12:00. Показов 9799. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Использую сокеты для отправки GET-запроса и получения HTML-кода запрашиваемой страницы. Все красиво и быстро работает ! С HTTPS у меня возникли проблемы. Отправляю стандартный GET-запрос на порт 443 - в ответ:

Code
1
2
3
4
5
6
HTTP/1.1 400 Bad Request
Server: nginx/1.9.4
Date: Fri, 25 Dec 2015 22:16:08 GMT
Content-Type: text/html
Content-Length: 270
Connection: close
HTML5
1
2
3
4
5
6
7
8
<html>
<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<center>The plain HTTP request was sent to HTTPS port</center>
<hr><center>nginx/1.9.4</center>
</body>
</html>
Хочу остаться на уровне сокетов! Понимаю, что нужно шифровать сам запрос. Буду признателен ответу специалиста! Предлагаю сотрудничество на взаимовыгодных условиях!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.12.2015, 12:00
Ответы с готовыми решениями:

Сокеты(отправка байтов серверу и получение ответа)
Нужна книга,в которой будет подробно описана работа с сокетами,т.е добавление байтов CUint и т.д. Очень нужна. Дайте ссылку на...

Отправка POST запроса и получение ответа
Здравствуйте! Я новичок в java, мне дали задание распарсерить данные (формат json) и отправить их на сервер. Первую часть задания сделал...

Отправка POST запроса в ВК и получение ответа
Пытаюсь загрузить аватар в группу ВК. И при отправке post запроса с изображением, в ответ приходит следующее: ...

20
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
26.12.2015, 21:38
Лучший ответ Сообщение было отмечено freeollo как решение

Решение

Цитата Сообщение от freeollo Посмотреть сообщение
Хочу остаться на уровне сокетов!
SSL реализован через сокеты. Пишете SSL_write, читаете SSL_read, шифрует библиотека.


В сети достаточно примеров. В упрощенном виде что-то такого типа (использовалась openssl):
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
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netdb.h>
#include <openssl/ssl.h>
 
int main() {   
    char hostname[]="ya.ru";
    int port = 443;
 
    SSL_library_init();
    OpenSSL_add_all_algorithms();
    SSL_load_error_strings();
    const SSL_METHOD *method = SSLv23_client_method();
    SSL_CTX *ctx = SSL_CTX_new(method);
    if ( ctx == NULL ) return -1;
 
    struct hostent *host;
    struct sockaddr_in addr;
 
    if ( (host = gethostbyname(hostname)) == NULL ) return -1;
    int sd = socket(PF_INET, SOCK_STREAM, 0);
    bzero(&addr, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    addr.sin_addr.s_addr = *(long*)(host->h_addr);
    if ( connect(sd, (struct sockaddr*)&addr, sizeof addr)) return -1;
    
    SSL *ssl = SSL_new(ctx);
    SSL_set_fd(ssl, sd); 
    if ( SSL_connect(ssl) == -1 )  return -1;
 
    char msg[] = "GET [url]https://ya.ru/[/url] HTTP/1.0\n\n";
    char buf[1024];
 
    SSL_write(ssl, msg, strlen(msg)); 
    long bytes;
    while ((bytes = SSL_read(ssl, buf, sizeof buf)) >0 ) {
      buf[bytes] = 0;
      printf("%s", buf);
    }
    printf ("\n");
    SSL_free(ssl);   
    close(sd);      
    SSL_CTX_free(ctx);   
    return 0;
}
Добавлено через 5 минут
PS. Тег [URL] в 33 строке добавлен здешним веб-редактором. Его в тексте не было.
1
0 / 1 / 0
Регистрация: 14.12.2015
Сообщений: 14
29.12.2015, 09:11  [ТС]
создал файл https.c
подключил библиотеку openssl
Результат:

gcc -I/root/openssl/openssl-1.0.2e/include -o https https.c
/tmp/cczA3MJJ.o: In function `main':
https.c.text+0x20): undefined reference to `SSL_library_init'
https.c.text+0x25): undefined reference to `OPENSSL_add_all_algorithms_noconf'
https.c.text+0x2a): undefined reference to `SSL_load_error_strings'
https.c.text+0x2f): undefined reference to `SSLv23_client_method'
https.c.text+0x3f): undefined reference to `SSL_CTX_new'
https.c.text+0xf5): undefined reference to `SSL_new'
https.c.text+0x10a): undefined reference to `SSL_set_fd'
https.c.text+0x116): undefined reference to `SSL_connect'
https.c.text+0x190): undefined reference to `SSL_write'
https.c.text+0x1d5): undefined reference to `SSL_read'
https.c.text+0x1f8): undefined reference to `SSL_free'
https.c.text+0x20e): undefined reference to `SSL_CTX_free'
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
29.12.2015, 11:24
freeollo, Линкер не находит библиотеку. Если openssl установлена стандартным способом
Bash
1
gcc `pkg-config --cflags --libs openssl` -o https https.c
0
0 / 1 / 0
Регистрация: 14.12.2015
Сообщений: 14
29.12.2015, 16:47  [ТС]
а как можно поставит нестандартным способом? Переместить папку openssl в user/include? Можно поставить openssl на Mас os. На сервере не совсем удобно писать скрипты
0
649 / 402 / 76
Регистрация: 21.09.2008
Сообщений: 1,387
29.12.2015, 20:25
freeollo, Вы попытались создать исполняемый файл без компоновки библиотеки libopenssl.a опцией -lopenssl и компоновщик ld не смог разрешить внешние ссылки на используемые функции.
Команда вида
gcc -I/root/openssl/openssl-1.0.2e/include -lopenssl -o https https.c
будет иметь смысл только при собранной библиотеке openssl.

Если не секрет, сервер под управлением какой ОС работает?
1
0 / 1 / 0
Регистрация: 14.12.2015
Сообщений: 14
30.12.2015, 00:02  [ТС]
Библиотеку собирал запуском на сервере /.config , oн создал include/openssl
Версия OS: Linux version 2.6.32-504.12.2.el6.x86_64

Добавлено через 38 минут
gcc -I/root/openssl/openssl-1.0.2e/include -lopenssl -o https https.c
так отреагировал мой сервер на -lopenssl

/usr/bin/ld: cannot find -lopenssl
0
649 / 402 / 76
Регистрация: 21.09.2008
Сообщений: 1,387
30.12.2015, 04:51
Цитата Сообщение от freeollo Посмотреть сообщение
Библиотеку собирал запуском на сервере /.config , oн создал include/openssl
Это отработал скрипт-конфигуратор, создающий Makefile. После его запуска запускали утилиту make?

Цитата Сообщение от freeollo Посмотреть сообщение
Версия OS: Linux version 2.6.32-504.12.2.el6.x86_64
Это ядро. Мне бы точнее узнать дистрибутив Linux: OpenSUSE, Ubuntu, Arch или ещё какой. А в /usr/lib есть libssl.a?

Цитата Сообщение от freeollo Посмотреть сообщение
так отреагировал мой сервер на -lopenssl
/usr/bin/ld: cannot find -lopenssl
Компоновщик не нашёл библиотеку libopenssl.a. Попробуйте указать опцию -Lpath-to-lib где расположен файл libopenssl.a.
0
0 / 1 / 0
Регистрация: 14.12.2015
Сообщений: 14
30.12.2015, 11:20  [ТС]
Цитата Сообщение от sharpey Посмотреть сообщение
Это отработал скрипт-конфигуратор, создающий Makefile. После его запуска запускали утилиту make?
запустил - не помогло

Цитата Сообщение от sharpey Посмотреть сообщение
Это ядро. Мне бы точнее узнать дистрибутив Linux: OpenSUSE, Ubuntu, Arch или ещё какой.
# cat /etc/issue
CentOS release 6.6 (Final)

и

# uname -r
2.6.32-504.12.2.el6.x86_64


Цитата Сообщение от sharpey Посмотреть сообщение
А в /usr/lib есть libssl.a?
там такого файла не оказалось, нашел я его в "/root/openssl/openssl-1.0.2e/libssl.a"

файл libopenssl.a команда find не нашла
0
649 / 402 / 76
Регистрация: 21.09.2008
Сообщений: 1,387
30.12.2015, 11:59
Попытайтесь теперь так:
gcc -Iroot/openssl/openssl-1.0.2e/include -L/root/openssl/openssl-1.0.2e/ -lssl -o https https.c
0
0 / 1 / 0
Регистрация: 14.12.2015
Сообщений: 14
30.12.2015, 14:54  [ТС]
без изменений
# gcc -I/root/openssl/openssl-1.0.2e/include -L/root/openssl/openssl-1.0.2e/ -lssl -o https https.c
/tmp/ccDBzgGT.o: In function `main':
https.c.text+0x20): undefined reference to `SSL_library_init'
https.c.text+0x25): undefined reference to `OPENSSL_add_all_algorithms_noconf'
https.c.text+0x2a): undefined reference to `SSL_load_error_strings'
https.c.text+0x2f): undefined reference to `SSLv23_client_method'
https.c.text+0x3f): undefined reference to `SSL_CTX_new'
https.c.text+0xf5): undefined reference to `SSL_new'
https.c.text+0x10a): undefined reference to `SSL_set_fd'
https.c.text+0x116): undefined reference to `SSL_connect'
https.c.text+0x190): undefined reference to `SSL_write'
https.c.text+0x1d5): undefined reference to `SSL_read'
https.c.text+0x1f8): undefined reference to `SSL_free'
https.c.text+0x20e): undefined reference to `SSL_CTX_free'
collect2: ld returned 1 exit status
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
30.12.2015, 18:02
Цитата Сообщение от freeollo Посмотреть сообщение
без изменений
Не хочешь pkg-config, так посмотри, перед тем как строку вбивать, где у тебя реально находится библиотека и как называется.
0
649 / 402 / 76
Регистрация: 21.09.2008
Сообщений: 1,387
30.12.2015, 20:03
Лучший ответ Сообщение было отмечено freeollo как решение

Решение

Приведённый пример собрался под FreeBSD 10 после включения заголовка <netinet/in.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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <openssl/ssl.h>
 
int main() {   
    char hostname[]="ya.ru";
    int port = 443;
 
    SSL_library_init();
    OpenSSL_add_all_algorithms();
    SSL_load_error_strings();
    const SSL_METHOD *method = SSLv23_client_method();
    SSL_CTX *ctx = SSL_CTX_new(method);
    if (ctx == NULL)
      return -1;
 
    struct hostent *host;
    struct sockaddr_in addr;
 
    if ((host = gethostbyname(hostname)) == NULL)
      return -1;
    int sd = socket(PF_INET, SOCK_STREAM, 0);
    bzero(&addr, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    addr.sin_addr.s_addr = *(long *)(host->h_addr);
    if (connect(sd, (struct sockaddr*)&addr, sizeof addr))
      return -1;
    
    SSL *ssl = SSL_new(ctx);
    SSL_set_fd(ssl, sd); 
    if (SSL_connect(ssl) == -1)
      return -1;
 
    char msg[] = "GET [url]https://ya.ru/[/url] HTTP/1.0\n\n";
    char buf[1024];
 
    SSL_write(ssl, msg, strlen(msg)); 
    long bytes;
    while ((bytes = SSL_read(ssl, buf, sizeof buf)) >0 ) {
      buf[bytes] = 0;
      printf("%s", buf);
    }
    printf("\n");
    SSL_free(ssl);   
    close(sd);      
    SSL_CTX_free(ctx);   
    return 0;
}
и командой
cc -Wall -o https -lssl -lcrypto https.c
Как видите, компонуются два библиотечных модуля libssl.a и libcrypto.a. Подозреваю, что libcrypto.a собирается вместе с libssl.a.
2
0 / 1 / 0
Регистрация: 14.12.2015
Сообщений: 14
31.12.2015, 11:50  [ТС]
Цитата Сообщение от gng Посмотреть сообщение
Не хочешь pkg-config, так посмотри, перед тем как строку вбивать, где у тебя реально находится библиотека и как называется.
через pkg-config не получается
# gcc `pkg-config --cflags --libs openssl` -o https https.c
/tmp/ccR2apBI.o: In function `main':
https.c.text+0x20): undefined reference to `SSL_library_init'
https.c.text+0x25): undefined reference to `OPENSSL_add_all_algorithms_noconf'
https.c.text+0x2a): undefined reference to `SSL_load_error_strings'
https.c.text+0x2f): undefined reference to `SSLv23_client_method'
https.c.text+0x3f): undefined reference to `SSL_CTX_new'
https.c.text+0xf5): undefined reference to `SSL_new'
https.c.text+0x10a): undefined reference to `SSL_set_fd'
https.c.text+0x116): undefined reference to `SSL_connect'
https.c.text+0x190): undefined reference to `SSL_write'
https.c.text+0x1d5): undefined reference to `SSL_read'
https.c.text+0x1f8): undefined reference to `SSL_free'
https.c.text+0x20e): undefined reference to `SSL_CTX_free'

Добавлено через 14 часов 8 минут
Eсли я подключу или перемещу в нужные папки все необходимые файлы *.h и *.a поставляемые openssl, то проект будет компилироваться не зависимо от того какая у меня стоит OS? Или мне нужно пройти процедуру установки openssl и наличие файлов *.h и *.a, в нужном месте, недостаточно для компиляции?
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
31.12.2015, 12:14
Цитата Сообщение от freeollo Посмотреть сообщение
Eсли я подключу или перемещу в нужные папки все необходимые файлы *.h и *.a поставляемые openssl, то проект будет компилироваться не зависимо от того какая у меня стоит OS? Или мне нужно пройти процедуру установки openssl и наличие файлов *.h и *.a, в нужном месте, недостаточно для компиляции?
Давайте по порядку.
1. Для сборки вашей программы нужна библиотека libopenssl вместе с заголочными файлами (или, как вариант две библиотеки libssl и libcrypto).
2. Стандартный способ установки библиотек - менеджер пакетов (apt-get, yum ....). Версии библиотек для разработчиков также включают заголовочные файлы и статические либы. Они обычто имеют суффикс -dev в Дебиане и -devel в РедХэте. Напр. у меня в Дебиане достаточно установить libssl-dev.
3. При таким образом установленной библиотеке для ее подключения компилятору достаточно дать опции, которые выводит команда pkg-config --cflags --libs openssl.
4. По умолчанию сборка динамическая - т.е. статические библиотеки (с расширением *.a) вовсе не нужны. Используются динамические (*.so).
5. Если вы где-то скачали библиотеку и не через пакет, и не в виде исходников, а в виде набора заголовочных файлов и статических библиотек, то, во-первых нужно проверить соответствие версий этих библиотек вашей архитектуре, потом проверить и разрешить их зависимости (напр. какую версию libc они требуют), затем указать их в строке компилятора либо через -L -l, либо прямым перечислением *.a файлов наряду с *.c файлами. Но этот путь, ИМХО, самый сложный и самый бестолковый. Обычно либо устанавливают библиотеку пакетом, либо компилируют из исходников.
0
0 / 1 / 0
Регистрация: 14.12.2015
Сообщений: 14
03.01.2016, 12:19  [ТС]
Получилось откомпилировать код Скрипт отправляет GET-запрос через https и получает HTML-код запрашиваемый страницы. Большое спасибо gng и sharpey
0
365 / 124 / 22
Регистрация: 08.01.2015
Сообщений: 1,418
Записей в блоге: 2
07.02.2019, 11:37
У меня вот так установилась:
Bash
1
2
whereis openssl
openssl: /usr/bin/openssl /usr/include/openssl /usr/local/ssl/bin/openssl /usr/share/man/man1/openssl.1ssl.gz
Компилирую:
Bash
1
gcc  -o https https.c -L. -lssl -lcrypto   -Wl,-I.,-rpath=/usr/local/
В итоге, исполняемый файл создался без ошибок (компилятор их не показал), но при запуске появляется сообщение:
"Permission denied
Обрыв терминальной линии".
Т.е. почему-то не работает.
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
09.02.2019, 11:54
Цитата Сообщение от Htext Посмотреть сообщение
У меня вот так установилась:
Складывается впечатление, что вы библиотеку руками ставили, что-то поломав при этом.
Выхлоп ldd для этой программы и любой системной использующей openssl (например /usr/bin/wget) для libcrypo и libssl отличается?
0
365 / 124 / 22
Регистрация: 08.01.2015
Сообщений: 1,418
Записей в блоге: 2
09.02.2019, 14:51
Да, руками, в итоге. Т.к. она, похоже, была изначально установлена (при предыдущей установке Ubuntu) неправильно. Или поломалась в процессе, как говорится. Поэтому нарушения связей не устранялись и при компиляции ошибки были. И в конце концов, видимо, я ее доломал окончательно.
Переустановил Ubuntu, вместо apt-get использовал aptitude - проблема решилась, все скомпилировалось.
Да, и вместо -rpath=usr/local/ использую теперь -L/usr/lib.

Bash
1
2
3
4
5
6
7
8
9
10
11
12
$ ldd /usr/bin/wget
    linux-vdso.so.1 =>  (0x00007ffce9d3b000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007fc8653eb000)
    libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007fc8651e6000)
    libssl.so.1.0.0 => /lib/x86_64-linux-gnu/libssl.so.1.0.0 (0x00007fc864f7d000)
    libcrypto.so.1.0.0 => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007fc864b38000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fc86491e000)
    libidn.so.11 => /usr/lib/x86_64-linux-gnu/libidn.so.11 (0x00007fc8646eb000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc864321000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc864104000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fc8658d5000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fc863f00000)

Не по теме:

Правда, именно Яндекс выдает ошибку 406, не желает контент отдавать. По всей видимости (я еще не проверял), ему требуется полный набор заголовков, а в стр.38 только 1 заголовок присутствует. А вот, скажем, Google вполне отдает контент главной страницы.


А вот интересно, если сделать этим кодом запрос на какой-нибудь зараженный вирусами сайт - по идее, код вируса ведь должен прийти на ТСР-соединение вместе с html-кодом?
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
09.02.2019, 15:23
Цитата Сообщение от Htext Посмотреть сообщение
Правда, именно Яндекс выдает ошибку 406, не желает контент отдавать. По всей видимости (я еще не проверял), ему требуется полный набор заголовков,
Попробуйте поменять url на / и добавить Host: еще возможно оно хочет HTTP/1.1 тогда не помешает Connection: close
Цитата Сообщение от Htext Посмотреть сообщение
вместе с html-кодом?
Да. Но скорее с каким-нибудь скриптом или картинкой.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.02.2019, 15:23
Помогаю со студенческими работами здесь

Отправка http запроса и получение ответа
я понимаю что есть дофига тем про это, я честно гуглила и искала, но находила в основном код без пояснений с непонятными мне функциями,...

Отправка запроса на сервер, и получение ответа
Нужно сделать запрос на сайт, &quot;http://....... .php и что бы он в ответ выдал Фамилию и пароль. Помогите пожалуйста.

Отправка POST запроса и получение ответа
Есть проблема. Нужно отправить на сайт POST запрос и в зависимости от этого запроса сайт выдает ответ(обычный echo). Нужно отправить...

Отправка Post запроса на сайт и получение ответа
Здравствуйте. Помогите решить такую проблему: есть сайт на котором всего одно поле для ввода. в которое нужно записать пароль чтобы...

Отправка запроса на сервер - получение ответа в xml и обработка
Всем добрый день. Искал по всем форумам и всем блогам, но нужного ответа не нашел и не добился результата. Отправляется Get запрос...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
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 . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru