@dlangru

Страница 396 из 719
Evgeny
02.02.2018
16:51:40
В него копируют внутри сисколла
мы читаем из него, а не пишем. ядро пишет

я вот не уверен, но спорить не буду, не знаю потому что

ща погуглю

Igor
02.02.2018
16:54:12
Мы читаем из буфера конечно не сисколлом. Заполняется он сисколлом во время вызва recv...

Google
Evgeny
02.02.2018
16:59:05
Мы читаем из буфера конечно не сисколлом. Заполняется он сисколлом во время вызва recv...
это если вызов блокирующий, а если данные уже лежат в буфере и мы тянем только их, то ничего в буфер не пишется. А именно такой случай мы тут и обсуждаем.

epoll или select нам сообщают, что данные есть, узнаем длину и читаем. Либо сразу все, либо частями. Экономия не на сисколлах, а на просто коллах.

Evgeny
02.02.2018
17:03:30
например во время вызова epoll_wait

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

Igor
02.02.2018
17:06:24
Нет, еполл только скажет что есть что читать

Что в буфере ядра сокеты есть данные

Evgeny
02.02.2018
17:12:09
Нет, еполл только скажет что есть что читать
по-твоему система пишет данные не сразу в буфер сокета, а сначала куда-то еще?

зачем так делать?

накой тогда вообще нужен буфер?

Igor
02.02.2018
17:16:48
Ну блин. Данные из драйвера езернета попадают в буфера ядра, там обрабатывется уровнем тсп и раскладывается в ядре по буферам сокет. Из этих буферов в ядре читаем в юзерспейс во время recv

Мы об этом говооим?

Evgeny
02.02.2018
17:18:37
ага

Google
Evgeny
02.02.2018
17:19:08
и данные в буфер сокета пишутся до того как делается реальное чтение

Assuming the packet is in sequence, the data payload is then copied into the socket’s receive buffer. At this point the kernel will wake up any processes doing a blocking read(2), or that are using an I/O multiplexing system call like select(2) or epoll_wait(2)to wait on the socket. When the userspace process actually calls read(2) on the file descriptor it causes the kernel to remove the data from its receive buffer, and to copy that data into a buffer supplied to the read(2) system call.

Pavel
02.02.2018
17:19:36
буфер ядра -> буфер сокета -> юзерспейс так выходит?

Evgeny
02.02.2018
17:19:45
нет

Pavel
02.02.2018
17:20:32
буфер ядра и буфер сокета это одно и то же?

Igor
02.02.2018
17:20:40
Да

Evgeny
02.02.2018
17:20:47
NIC -> буфер сокета -> юзерспейс

Igor
02.02.2018
17:20:49
Они оба в ядре

Pavel
02.02.2018
17:21:20
А в NIC там что? Тоже какой-то буфер?

И может ли из него читать не ядро?

Evgeny
02.02.2018
17:22:02
А в NIC там что? Тоже какой-то буфер?
сетевая карта, у нее внутри наверное есть свой буфео

И может ли из него читать не ядро?
насколько я понимаю нет

полюбому будет копирование в юзерспейс

Pavel
02.02.2018
17:23:11
А если написать ядерный модуль, то все равно никак в него нельзя залезть из юзерспейса?

Хотя глупый вопрос, можно конечно )

Evgeny
02.02.2018
17:24:04
Pavel
02.02.2018
17:24:06
юзерспейс же как-то читатет все остальное

Ну короче, главное что у нас TCPConnection работает в юзерспейсе и само имеет буфер. А я еще копирую его в свой буфер приложения.

Pavel
02.02.2018
17:34:14
а что тут может быть не точного?

Google
Evgeny
02.02.2018
17:34:49
это же просто интерфейс, а наличие буфера это детали реализации

я не уверен что в стандартных драйверах есть отдельный буфер, накой он нужен?

Pavel
02.02.2018
17:35:59
ну с этой точки зрения да

но вроде как есть метод peek() который дает указатель на внутренний буфер TCPConnection

https://github.com/vibe-d/vibe-core/blob/master/source/vibe/core/net.d#L589 да вот он) это часть интерфейса и прямо на внутренний буфер

Evgeny
02.02.2018
17:39:43
хорошо, теперь уверен :)

но если есть peek, значит копировать в еще один буфер не обязательно

кстати в линупсе есть http://man7.org/linux/man-pages/man2/splice.2.html

Pavel
02.02.2018
17:42:14
? буду рефакторить

Evgeny
02.02.2018
17:42:56
? буду рефакторить
там по-моему вообще можнт напрямую стримить из сокета в сокет

Pavel
02.02.2018
17:43:26
Да я видел, но как-то меня не устроило, не помню уже почему

Вроде потому что там что-то крешилось

Evgeny
02.02.2018
17:44:14
http://vibed.org/api/vibe.core.stream/pipe

узнаем длину доступных данных и стримим

крешилось или эксепшн кидало?

Pavel
02.02.2018
17:45:47
Щас не помню, перепроверю

Ассерт

Я запускал 2 таска - передача данных между сокетами в две стороны

Один таск закрывал сокет при окончании передачи а другой слетал с ассертом

Evgeny
02.02.2018
17:47:54
не надо, он внутри все равно через доп буферы гоняет

Google
Evgeny
02.02.2018
17:48:15
я посмотрел исходники, никакого peek там нет

видимо потому что на generic стримы рассчитан

а peek это походу чисто сокетовский метод

Ассерт
это бага по любому, должен просто эксепшн кидать

Pavel
03.02.2018
15:38:01
https://dlang.org/blog/2018/02/03/the-dbugfix-campaign/

qwerty
03.02.2018
21:16:47
Надо разбираться с dmd и помогать фиксить)

Oleg
04.02.2018
03:43:10
Надо разбираться с dmd и помогать фиксить)
Давно такая мысль в голове крутится, но порог высоковат. А материала для входа очень мало

qwerty
04.02.2018
07:10:15
вот, вот. Я даже точку входа найти не смог

NullSanya
04.02.2018
07:36:26
Добрый день. У меня есть вопрос: а dlangui запускается с dsfml? Я видел пример на гитхабе в dlangui-example, но заставить его работать мне не удалось.

Evgeny
04.02.2018
08:32:51
я, увы, не разбираюсь в dlangui

Admin
ERROR: S client not available

NullSanya
04.02.2018
08:38:21
Много вылезает проблем еще на этапе компиляции, типа: -при подключении dlangui, статические либы dsfml линкер не обнаруживает нигде, кроме как рядом с файлом dub.json, далее нигде не указано, что надо еще подключать gdi32.lib Далее при запуске обнаруживается, что не подгружается opengl через derelict и оно падает с Access Violation. А после этого оно просто не рисует ничего, то есть sfml свой смайлик рисует, а вот dlangui - ничего. Если что, то компилирую последним dmd в х86, все остальное - как в примере. Надеюсь кто-то сможет помочь

qwerty
04.02.2018
14:47:11
а тут есть кто разбирается в assembly? RSI регистр - всегда указатель?

NullSanya
04.02.2018
14:49:30
То самое чувство, когда проще плюнуть и взять winapi
Это проблема возникает, если использовать в связке с dsfml

Так все нормально работает

Evil
04.02.2018
14:49:52
Что за хрень такая?

NullSanya
04.02.2018
14:50:00
Evil
04.02.2018
14:50:04
Да

Google
NullSanya
04.02.2018
14:50:23
Это либа для создания 2д приложений

ну типа там игры например

Автор dlangui на хабре в комментариях показывал скрин, как связал это вместе

У меня уже на компиляции проблемы

Evil
04.02.2018
14:51:16
Он на винде это делал?

NullSanya
04.02.2018
14:51:40
Он на винде это делал?
Да, ибо либы в примере для винды

Evil
04.02.2018
14:54:30
https://sourceforge.net/projects/wxd/

А это дрочибельно?

NullSanya
04.02.2018
14:55:07
Даже не знаю, мне dlangui нужен для редактора внутри игры

Stepanos
04.02.2018
14:56:00
https://github.com/vurtun/nuklear

NullSanya
04.02.2018
14:57:08
Вопрос в том, насколько сложно его подружить с dsfml

Evil
04.02.2018
15:00:16
https://github.com/vurtun/nuklear
Ооо какая красота

Надо потыкать

NullSanya
04.02.2018
15:01:21
Вот да

Evil
04.02.2018
15:01:23
Биндинг для D сделать не хитро будет

NullSanya
04.02.2018
15:02:13
уже есть

а вот с sfml нашел как соединяется

Evil
04.02.2018
15:02:41
уже есть
Дай ссылку

NullSanya
04.02.2018
15:02:55
https://github.com/mogud/nukleard

Проблема номер 2: как его сбилдить для dmd?

ну статическую либу

OMF же вроде?

Страница 396 из 719