1. Куча / Говнокод #27062

    +3

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 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 Октября 2020

    Комментарии (72) RSS

    • Дамы и господа, представляю вам демонстрацию кооперативной многозадачности и сетевого программирования на эйфории.

      К сожалению, неблокирующие сокеты не работают кросс-платформенно, но работает select.

      Осталось добавить кольцевой буфер, и можно сделать чат.

      С помощью утилиты euc можно получить статически слинкованный бинарник
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
      • Вообще пишут, что майкрософт вдохновлялся "XENIX" когда прикручивал в "DOS" каталоги и хендлы файлов.
        Ответить
        • показать все, что скрытоvanished
          Ответить
          • «NT» больше похожа на «OS/2», чем на «VMS». Хотя да, вся эта питушня на «Unix» не похожа.
            Ответить
            • Читни лонгридца: https://www.itprotoday.com/compute-engines/windows-nt-and-vms-rest-story

              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.
              Ответить
              • Интересно. Но в любом случае там много всего перепитушили. В «VMS» пути к файлам пишутся примерно в таком стиле:
                SYSTEM$DISC$:[DIR.SUBDIR.SUBSUBDIR]readme.txt;1
                А в «NT» — в досовском.
                Ответить
                • Ядру NT (мы же про ядро?) и Executive всё равно на пути к файлу.

                  Ты просто откртываешь какой-то объект: \Foo\Bar\Bus, и шлешь ему ioctl. А ядро перенаправляет их драйверу, создавшему этот объект (на самом деле там фильтры есть, еще хуйня какая-то, Борманд знает вроде), но в целом именно так.

                  Все эти ваши C:\ это вообще симлинки
                  Ответить
                  • Драйвер файлухи получает весь хвост после имени тома, емнип. Т.е. у файлов реальных объектов как таковых нет, только у томов.

                    Юзермод: C:\foo\bar
                    Ядро: \\.\Volume5\foo\bar
                    Драйвер файлухи для \\.\Volume5: \foo\bar
                    Ответить
                    • да, точно
                      Ответить
                    • На самом деле там еще ObjectManager который ссылку резолвит, и фильтры файловой систсемы (аппер, ловер) а после драйвера файлухи еще вроде слой кеширования блочных устройств, и посылка IPR в Harddrive, и там PnPManager и еще фильтры, но я не Maxim S. Shatskih, и без книжки Руссиновича конечно всю цепочку не восстанлвлю по памяти
                      Ответить
                • Кстати, есть https://ru.wikipedia.org/wiki/OpenVMS
                  Но на x86 не встанет
                  Ответить

    Добавить комментарий