- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
- 53
- 54
- 55
- 56
include std/socket.e as s
include std/error.e as err
constant PORT = 5050
constant BACKLOG = 5
procedure die(object result, sequence action)
printf(2, "Error %d in %s", {result, action})
err:crash(action)
end procedure
procedure ensure_zero(integer result, sequence action)
if result != 0 then
die(result, action)
end if
end procedure
function ensure_seq(object result, sequence action)
if atom(result) then
die(result, action)
end if
return result
end function
enum SOCKET, READ, WRITE, ERROR
constant PHRASE = "Hello from Euphoria\n"
procedure client_proc(sequence socket)
while 1 do
for i = 1 to length(PHRASE) do
sequence result = s:select({}, socket, {}, 0, 100)
sequence result_s = result[1]
if result_s[WRITE] = 1 then
s:send(socket, {PHRASE[i]}, 0)
end if
task_yield()
end for
end while
end procedure
constant client_proc_id = routine_id("client_proc")
sequence server = ensure_seq(s:create(s:AF_INET, s:SOCK_STREAM, 0), "create")
ensure_zero(s:bind(server, "127.0.0.1", PORT), "bind")
ensure_zero(s:listen(server, BACKLOG), "listen")
while 1 do
sequence listen_result = s:select(server, {}, {}, 0, 100)
if listen_result[1][READ] = 1 then
sequence client = ensure_seq(s:accept(server), "accept")
printf(1, "Here comes %s\n", {client[2]})
atom task = task_create(client_proc_id, {client[1]})
task_schedule(task, {0.5, 0.5})
end if
task_yield()
end while
MAKAKA 27.10.2020 03:35 # +2
К сожалению, неблокирующие сокеты не работают кросс-платформенно, но работает select.
Осталось добавить кольцевой буфер, и можно сделать чат.
С помощью утилиты euc можно получить статически слинкованный бинарник
guest8 27.10.2020 03:36 # −999
bormand 27.10.2020 08:24 # +1
Ну правильно, если по 100 попугаев в каждом селекте спать... Больше тасок - больше лагов.
Какое масштабирование )))
guest8 27.10.2020 10:22 # −999
guest8 27.10.2020 10:29 # −999
bormand 27.10.2020 11:05 # 0
Эм, а там никаких ивентов нету что ли?
guest8 27.10.2020 11:06 # −999
bormand 27.10.2020 11:10 # 0
guest8 27.10.2020 11:12 # −999
bormand 27.10.2020 11:20 # 0
З.Ы. Ещё task_suspend какой-то есть.
guest8 27.10.2020 11:24 # −999
bormand 27.10.2020 11:25 # 0
А должен select/poll, как все нормальные юзермодные шедулеры. И резюмить таски, которые "заблокировались" на чтении или записи. Но, видимо, автор не осилил это в своём курсаче.
guest8 27.10.2020 11:28 # −999
bormand 27.10.2020 13:04 # 0
Такова жизнь... Виндовые шедулеры ещё и про оконные сообщения знают. Как иначе на одном треде сделать быструю реакцию без 100% загрузки проца?
guest8 27.10.2020 13:32 # −999
bormand 27.10.2020 14:14 # 0
guest8 27.10.2020 14:17 # −999
bormand 27.10.2020 13:23 # 0
Можешь тогда себе сам слепить кошерный шедулер.
Сделай лоу-приорити таску которая тупо спит в select'е и пробуждает таски для которых есть готовые сокеты. И обёртки для read, write и accept которые добавляют пару (сокет, self) в массив для селекта и суспендятся.
Поскольку таска лоу приорити, она будет вызываться только когда все "события" обработаны. Ну если я правильно понимаю что такое приоритет.
guest8 27.10.2020 13:36 # −999
Fike 27.10.2020 13:41 # 0
там кстати говорили что есть такая хуйня, что на самом деле даже неблокирующие сокеты блокирующие, если буфер заполнен - в этом случае сисколл просто стоит и ждет, пока сможет запихнуть данные
какая производительность )))
guest8 27.10.2020 13:45 # −999
bormand 27.10.2020 14:33 # 0
Есть пруфы?
MAPTbIwKA 27.10.2020 14:41 # 0
Обе хуйни вроде одно и тоже, но одна пришла из бзды, а вторая из SysV
Fike 27.10.2020 22:50 # 0
MAKAKA 27.10.2020 22:52 # 0
Fike 27.10.2020 23:06 # 0
MAKAKA 27.10.2020 23:15 # 0
guest8 27.10.2020 23:16 # −999
MAKAKA 27.10.2020 23:17 # 0
Люди не решают сами когда им рождаться
guest8 27.10.2020 23:39 # −999
MAKAKA 27.10.2020 23:40 # 0
guest8 27.10.2020 23:45 # −999
MAKAKA 27.10.2020 23:46 # 0
кто же это?|
guest8 27.10.2020 23:48 # −999
Desktop 27.10.2020 23:49 # 0
MAKAKA 27.10.2020 23:50 # 0
guest8 27.10.2020 23:52 # −999
Desktop 27.10.2020 23:44 # 0
defecate-plusplus 27.10.2020 23:47 # +1
Desktop 28.10.2020 00:05 # 0
guest8 28.10.2020 00:07 # −999
Desktop 28.10.2020 00:08 # 0
defecate-plusplus 28.10.2020 00:11 # 0
В воцапе дико бесит недоразвитость. Особенно на десктопе. Терплю это недоразумение ради < 5 контактов
rotoeb 28.10.2020 00:14 # 0
guest8 27.10.2020 23:16 # −999
Fike 27.10.2020 23:18 # +1
MAKAKA 27.10.2020 23:19 # 0
Fike 27.10.2020 23:21 # 0
guest8 28.10.2020 00:27 # −999
Fike 28.10.2020 00:35 # 0
неравноценная какая-то сделка короч
guest8 28.10.2020 00:37 # −999
Fike 28.10.2020 00:37 # 0
да, я из спб
guest8 28.10.2020 00:40 # −999
Fike 28.10.2020 00:47 # 0
MAKAKA 28.10.2020 00:42 # 0
guest8 28.10.2020 00:43 # −999
MAKAKA 28.10.2020 00:45 # 0
Fike 28.10.2020 00:48 # 0
MAKAKA 28.10.2020 00:51 # 0
Desktop 28.10.2020 00:52 # 0
Fike 28.10.2020 00:53 # 0
guest8 27.10.2020 11:35 # −999
bormand 27.10.2020 12:28 # 0
guest8 27.10.2020 13:38 # −999
Saehrimnir 27.10.2020 15:34 # 0
MAPTbIwKA 27.10.2020 15:36 # +1
tl;tr
In fact, you can read sections of VAX/VMS Internals and Data Structures (Digital Press) as an accurate description of NT internals simply by translating VMS terms to NT terms.
Saehrimnir 27.10.2020 15:48 # 0
MAPTbIwKA 27.10.2020 15:52 # +1
Ты просто откртываешь какой-то объект: \Foo\Bar\Bus, и шлешь ему ioctl. А ядро перенаправляет их драйверу, создавшему этот объект (на самом деле там фильтры есть, еще хуйня какая-то, Борманд знает вроде), но в целом именно так.
Все эти ваши C:\ это вообще симлинки
bormand 27.10.2020 15:53 # +2
Юзермод: C:\foo\bar
Ядро: \\.\Volume5\foo\bar
Драйвер файлухи для \\.\Volume5: \foo\bar
MAPTbIwKA 27.10.2020 15:56 # 0
MAPTbIwKA 27.10.2020 16:02 # +2
MAKAKA 27.10.2020 23:26 # 0
Но на x86 не встанет