@dlangru

Страница 594 из 719
Pavel
05.06.2018
19:21:49
Ну вроде норм на первый взгляд, дальше надо разбираться

Oleg
05.06.2018
19:22:19
тоесть с accept так и оставить через try-catch?

Pavel
05.06.2018
19:22:46
Ну continue не надо делать

Oleg
05.06.2018
19:22:47
а как понять что соединение отошло?

Google
Pavel
05.06.2018
19:22:59
Сейчас получается у тебя по тихому ошибка гасится и все

Oleg
05.06.2018
19:23:12
Ну continue не надо делать
эт я уже понял, меня смущает логика на исключениях

Pavel
05.06.2018
19:23:16
auto res = sock.receive(buf[readed .. $]); if (res == Socket.ERROR) { if (errno == EAGAIN) res = 0; else throw new Exception("TCP Socket receive error " ~ errno.to!string); }

Вот это непонятно что, смешал высокоуровевые сокеты std и libc linux

Oleg
05.06.2018
19:24:10
Вот это непонятно что, смешал высокоуровевые сокеты std и libc linux
да блин! я ж говорю, что не понимаю как норм сделать)

Pavel
05.06.2018
19:25:21
Убери errno, пользуйся для получения ошибки тем что предлагает std.socket

Oleg
05.06.2018
19:30:49
как понимаю

Pavel
05.06.2018
19:31:05
Должны быть константы )

А ты делаешь без select ?

Почему бы его туда не приплести

Каждый раз как добираешься до чтения из сокета - добавляй его в SocketSet и делай select()

Если там пусто то и читать нечего.

Google
qwerty
05.06.2018
19:33:51
так а select не станет блокировать?

Pavel
05.06.2018
19:34:49
нет

А, понял о чем ты

Oleg
05.06.2018
19:36:36
так а select не станет блокировать?
ну, наверное, если таймаут 0, то нет

Pavel
05.06.2018
19:37:11
Да, наверное стоит select() сам по себе сделать как-то неблокирующим

qwerty
05.06.2018
19:38:13
Дело в том, что я не понимаю( Можно пример, как сделать select неблокирующим?

Ievgenii
05.06.2018
19:40:48
Pavel
05.06.2018
19:41:11
Блокирующий

Ievgenii
05.06.2018
19:41:15
Его вызов будет блокирующим только если передавать ему блокирующие сокеты

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

qwerty
05.06.2018
19:41:40
О_О_О_О_О

вот это поворот!

Ievgenii
05.06.2018
19:41:53
Если передавать не блокирующий сокет - он не блокирующий

Pavel
05.06.2018
19:42:36
Думаю что это не так )

Ievgenii
05.06.2018
19:42:46
А ты проверь

qwerty
05.06.2018
19:43:36
так а можно просто ссылку на документацию?

Ievgenii
05.06.2018
19:44:02
https://dlang.org/library/std/socket/socket.select.html

Wait for a socket to change status. A wait timeout of Duration or TimeVal, may be specified; if a timeout is not specified or the TimeVal is null, the maximum timeout is used. The TimeVal timeout has an unspecified value when selectreturns.

Если тайм 0, то возвращает те сокеты, которые имеют данные на вход или готовы для записи

qwerty
05.06.2018
19:45:28
так это у меня и открыто. Но тут ничего про блокируемость сокета в сете ничего не сказано

Google
Pavel
05.06.2018
19:45:41
А если не 0, то он будет ждать событий до таймаута, даже на всех неблокирующих сокетах

qwerty
05.06.2018
19:45:44
поэтому моему удивлению не было предела

Pavel
05.06.2018
19:46:01
The timeout argument specifies the interval that select() should block waiting for a file descriptor to become ready. The call will block until either: * a file descriptor becomes ready; * the call is interrupted by a signal handler; or * the timeout expires. Вот надо читать первоисточник )

http://man7.org/linux/man-pages/man2/select.2.html

Pavel
05.06.2018
19:48:22
Нет не готов

Есть такое понятие как событие, возникшее на сокете

Ievgenii
05.06.2018
19:48:37
Просто возьми и попробуй. Я с телефона.

Pavel
05.06.2018
19:48:57
А что изменится? Я пробовал уже года полтора назад, сейчас неохота.

Можно сделать в консоли перед и после select() вызовы writeln("Waiting for data..."); select(...) writeln("Data received, processing"); И он остановится после первого writeln

Если бы он был блокирующим то во первых он бы бесконечно выводил строки в stdout а во вторых жрал бы процессор на 100%

qwerty
05.06.2018
19:52:07
Блин, сам скоро проверю

Так, а с каким timeout проверять?

0 как я понимаю, не станет ждать изменений в сокетах

Pavel
05.06.2018
19:59:15
Ну поставь 1 секунду

qwerty
05.06.2018
19:59:28
Ну ок

Andrey
05.06.2018
20:00:02
select возвращает дескрипторы, операции ввода-вывода на которых не будут заблокированы. т.е. что бы прочитать что то - не надо ждать. 0 - проверит и сразу вернется, > 0 - либо вернет дескрипторы, либо по таймауту выйдет, null - ждать до последнего. Вродеж все написано в манах, парни_

Pavel
05.06.2018
20:01:12
Да я не знаю че он говорит что селект неблокирующий

Andrey
05.06.2018
20:02:28
да и нафиг он не нужен тут. сокеты в неблокирующем режиме ж, есть даже спец метод bool wouldHaveBlocked() nothrow @nogc { version(Windows) return _lasterr() == WSAEWOULDBLOCK; else version(Posix) return _lasterr() == EAGAIN; else static assert(0); }

Google
Filio
05.06.2018
20:02:52
всё-таки майкрософт купил гитхаб? пиздец котёнку.

qwerty
05.06.2018
20:03:29
Так непонятно, пока select не работает, сокет может что-то принять и следующий select это покажет?

qwerty
05.06.2018
20:03:57
Вроде понял

Ievgenii
05.06.2018
20:12:24
Да я не знаю че он говорит что селект неблокирующий
Ну так передай тайм-аут 0 и он не блокирующий

Pavel
05.06.2018
20:13:40
Ну так передай тайм-аут 0 и он не блокирующий
Зачем тогда все эти твои аргументы про блокирующте сокеты? Его поведение вообще не зависит от того какие сокеты он слушает

Если селектить блокирующий сокет с таймаутом 0 то селект все равно сразу вернется и ждать ничего не будет.

Ievgenii
05.06.2018
20:14:26
Как доберусь до компа - сделаю тест

Oleg
05.06.2018
20:19:37
складывается впечатление, что работа с сокетами мало чем отличается от работы с ком-портом

Admin
ERROR: S client not available

Oleg
05.06.2018
20:20:07
select тот же, read/write те же

Dmitry
06.06.2018
06:19:18
MS шикарно троллит https://pbs.twimg.com/media/DerxhrEWsAYQsa7.jpg

Denis
06.06.2018
06:21:09
а линкедин тоже МС?

Stanislav
06.06.2018
06:21:17
купили ну

кмк это фейк )

Dark
06.06.2018
09:24:27
Бот вроде снова стал выплевывать пакеты махом

Denis
06.06.2018
09:26:26
Бот вроде снова стал выплевывать пакеты махом
он всегда так делал - телеграм блочат а туннель ипв6 виснет. когда я перезагружаю комп всё восстанавливается на некоторое время

сраный РКН

deviator/serialport крутой логотип запилил

Google
Denis
06.06.2018
09:37:31
https://forum.dlang.org/post/pf5bj1$n5h$1@digitalmars.com

Oleg
06.06.2018
11:24:45
складывается впечатление, что работа с сокетами мало чем отличается от работы с ком-портом
но! как я понял receive никогда не возвращает 0, если есть соединение в неблокирующем режиме возвращается -1 (Socket.ERROR) если нет данных то есть 0 прочитанных байт как сигнал к закрытию соединения

Andrey
06.06.2018
13:53:11
0 - другая сторона закрыла соединение

Oleg
06.06.2018
13:55:03
0 - другая сторона закрыла соединение
ну да, но ведь со стороны сервера этот сокет можно уже закрывать и ждать новый, правильно?

этот же сокет больше не может быть использован

Andrey
06.06.2018
13:55:36
ну как бы да, ибо ты больше по нему ничего не примешь)

Oleg
06.06.2018
13:56:15
значит вроде разобрался

нет... чёт не до конца видимо разобрался

listen это что есть?

не общее количество соединений?

ну типа максимальное

максимальное количество соединений отдельно нужно контролировать, по всей видимости

Andrey
06.06.2018
14:15:49
параметр в listen? это размер очереди ожидающих обработки запросов на соединение, после заполнения запросы будут отбрасываться

я так понимаю, имеет значение, если запросы прут чаще, чем твоя программа успевает их принимать accept-ом

но это не максимальное количество соединений, да

Oleg
06.06.2018
14:54:49
нехватка базовых знаний ударила по голове... этим моментам в вузах каких-нибудь учат? или вузы только для фундаментальных знаний?)

типа физика, математика, алгоритмы...

Pavel
06.06.2018
14:58:45
В хороших вузах учат, курс называется типа "Архитектура операционных систем"

И там где-нибудь есть пару лекций про то как работают сокеты

Stanislav
06.06.2018
15:00:25
в хороших забугорных вузах на специальностях типа CS много чему хорошему учат вроде как) хотя и у нас много прям хороших лекций по алгоритмам и структурам данных

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