
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

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

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

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

Ievgenii
05.06.2018
19:48:11

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%

Ievgenii
05.06.2018
19:51:34

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 это покажет?

Dark
05.06.2018
20:03:33

Pavel
05.06.2018
20:03:44

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

Ievgenii
05.06.2018
20:12:24

Pavel
05.06.2018
20:13:40
Если селектить блокирующий сокет с таймаутом 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
сраный РКН
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

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

Oleg
06.06.2018
13:55:03
этот же сокет больше не может быть использован

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 много чему хорошему учат вроде как)
хотя и у нас много прям хороших лекций по алгоритмам и структурам данных

Denis
06.06.2018
15:11:23
даже в забугорье большинство кодеров - самоучки