Upgrade to Pro — share decks privately, control downloads, hide ads and more …

実録mruby組み込み体験

 実録mruby組み込み体験

Fukuoka.rb 0x100 回 LT 大会 (#256)

More Decks by Misaki Shioi(塩井美咲/しおい)

Other Decks in Programming

Transcript

  1. ԘҪඒ࡙ [email protected]


    'VLVPLBSCYճ-5େձ

    ࣮࿥
    NSVCZ૊ΈࠐΈମݧ

    View Slide

  2. aaॕ'VLVPLBSC։࠵

    View Slide

  3. ࣗݾ঺հ
    ԘҪඒ࡙ ͓͍͠

    (JU)VC!TIJPJNN
    [email protected]
    'VLVPLBSCͱ"TBLVTBSCʹ͍ΔNSVCZॳֶऀ
    ࠷ۙͷग़དྷࣄɿࡢ೔Ѫ༻ͷ؟ڸΛഁյ͠·ͨ͠

    View Slide

  4. NSVCZͱ͸
    Ҿ༻IUUQTHJUIVCDPNNSVCZNSVCZXIBUJTNSVCZ
    NSVCZJTUIFMJHIUXFJHIUJNQMFNFOUBUJPOPGUIF3VCZMBOHVBHF
    DPNQMZJOHUP QBSUPG
    UIF*40TUBOEBSE*UTTZOUBYJT3VCZY
    DPNQBUJCMF
    NSVCZDBOCFMJOLFEBOEFNCFEEFEXJUIJOZPVSBQQMJDBUJPO8F
    QSPWJEFUIFJOUFSQSFUFSQSPHSBNNSVCZ BOEUIFJOUFSBDUJWFNSVCZ
    TIFMMNJSCBTFYBNQMFT:PVDBOBMTPDPNQJMF3VCZQSPHSBNTJOUP
    DPNQJMFECZUFDPEFVTJOHUIFNSVCZDPNQJMFSlNSCDz

    View Slide

  5. NSVCZͱ͸
    Ҿ༻IUUQTHJUIVCDPNNSVCZNSVCZXIBUJTNSVCZ
    NSVCZJTUIFMJHIUXFJHIUJNQMFNFOUBUJPOPGUIF3VCZMBOHVBHF
    DPNQMZJOHUP QBSUPG
    UIF*40TUBOEBSE*UTTZOUBYJT3VCZY
    DPNQBUJCMF
    NSVCZDBOCFMJOLFEBOEFNCFEEFEXJUIJOZPVSBQQMJDBUJPO8F
    QSPWJEFUIFJOUFSQSFUFSQSPHSBNNSVCZ BOEUIFJOUFSBDUJWFNSVCZ
    TIFMMNJSCBTFYBNQMFT:PVDBOBMTPDPNQJMF3VCZQSPHSBNTJOUP
    DPNQJMFECZUFDPEFVTJOHUIFNSVCZDPNQJMFSlNSCDz
    ʮNSVCZ͸ΞϓϦέʔγϣϯʹϦϯΫͯ͠૊ΈࠐΉ͜ͱ͕Ͱ͖Δʯ
    [

    View Slide

  6. 3VCZͰॻ͔Εͨιʔείʔυͱ
    $Ͱॻ͔ΕͨΞϓϦέʔγϣϯ͕͋Δͱ͖ɺ
    ΞϓϦέʔγϣϯ $

    3VCZ
    ʮNSVCZΛΞϓϦέʔγϣϯʹ૊ΈࠐΉʯΠϝʔδ

    View Slide

  7. 3VCZͰॻ͔ΕͨॲཧΛΞϓϦέʔγϣϯίʔυʹຒΊࠐΈɺ
    ΞϓϦέʔγϣϯ $

    3VCZ
    ʮNSVCZΛΞϓϦέʔγϣϯʹ૊ΈࠐΉʯΠϝʔδ
    3VCZ

    View Slide

  8. ຒΊࠐΜͩॲཧ͝ͱΞϓϦέʔγϣϯΛ࣮ߦ͢Δ
    ΞϓϦέʔγϣϯ $

    3VCZ
    ʮNSVCZΛΞϓϦέʔγϣϯʹ૊ΈࠐΉʯΠϝʔδ
    3VCZ

    View Slide

  9. NSVCZΛ$ΞϓϦέʔγϣϯʹ૊ΈࠐΉํ๏͍Ζ͍Ζ
    &YFDVUJOH3VCZDPEFXJUINSVCZ
    IUUQTNSVCZPSHEPDTBSUJDMFTFYFDVUJOHSVCZDPEFXJUINSVCZIUNM

    View Slide

  10. NSVCZΛ$ΞϓϦέʔγϣϯʹ૊ΈࠐΉํ๏͍Ζ͍Ζ

    ΞϓϦέʔγϣϯίʔυ಺ͰNSVCZͷ$"1*Λհͯ͠
    3VCZͷιʔείʔυΛ࣮ߦ͢Δํ๏
    3VCZ
    ΞϓϦέʔγϣϯ $

    View Slide

  11. NSVCZΛ$ΞϓϦέʔγϣϯʹ૊ΈࠐΉํ๏͍Ζ͍Ζ

    ιʔείʔυ 3VCZ
    Λݩʹ$ͷؔ਺Λ࡞੒͠ɺ
    ΞϓϦέʔγϣϯίʔυ಺͔ΒJODMVEFͯ͠ݺͼग़͢ํ๏
    3VCZ ΞϓϦέʔγϣϯ $

    $
    $

    View Slide

  12. NSVCZΛ$ΞϓϦέʔγϣϯʹ૊ΈࠐΉํ๏͍Ζ͍Ζ

    ιʔείʔυ 3VCZ
    ͔ΒόΠτίʔυ͕هड़͞ΕͨϑΝΠϧΛ࡞੒
    ΞϓϦέʔγϣϯίʔυ಺͔ΒಡΈࠐΉํ๏
    ͳͲͳͲʜ
    3VCZ ΞϓϦέʔγϣϯ $

    όΠτίʔυ NSCD

    NSCD

    View Slide

  13. ΍ͬͯΈ·͠ΐ͏

    View Slide

  14. ࠓճ΍Δ͜ͱ
    ͋Δͱ͜Ζʹ$Ͱॻ͔Εͨ5$1Τίʔαʔόʔ͕
    ΫϥΠΞϯτ αʔόʔ
    )FMMP
    )FMMP

    View Slide

  15. ࠓճ΍Δ͜ͱ
    αʔόʔ
    5$1Τίʔαʔόʔ $
    ͷ࣮૷
    int main(void)

    {

    // αʔόʔΞυϨε৘ใͷऔಘɹ

    // ιέοτͷ࡞੒

    // ϦΫΤετͷ଴ͪड͚

    // ϦΫΤετͷड͚෇͚

    // ϦΫΤετͷಡΈࠐΈ

    // Ϩεϙϯεͷૹ৴

    // ιέοτͷഁغ

    return 0;

    }

    View Slide

  16. ࠓճ΍Δ͜ͱ
    int main(void)

    {

    // αʔόʔΞυϨε৘ใͷऔಘɹ

    // ιέοτͷ࡞੒

    // ϦΫΤετͷ଴ͪड͚

    // ϦΫΤετͷड͚෇͚

    // ϦΫΤετͷಡΈࠐΈ

    // Ϩεϙϯεͷૹ৴

    // ιέοτͷഁغ

    return 0;

    }
    ⬅︎
    ͜Ε͕ۤखͳͷͰ
    ɹ3VCZͰ
    αʔόʔ
    5$1Τίʔαʔόʔ $
    ͷ࣮૷

    View Slide

  17. struct addrinfo server_addr_hints, *server_addr, *server_addr_tmp;

    int addrinfoerr;

    memset(&server_addr_hints, 0, sizeof(struct addrinfo));

    server_addr_hints.ai_family = AF_INET;

    server_addr_hints.ai_socktype = SOCK_STREAM;

    server_addr_hints.ai_
    fl
    ags = AI_PASSIVE;

    if ((addrinfoerr = getaddrinfo(HOST, PORT, &server_addr_hints, &server_addr)) < 0) {

    gai_strerror(addrinfoerr);

    }
    <$ͷ৔߹>αʔόʔΞυϨε৘ใऔಘ

    // ศ্ٓ"'@*/&5ʹ͍ͯ͠·͢

    View Slide

  18. struct addrinfo server_addr_hints, *server_addr, *server_addr_tmp;

    int addrinfoerr;

    memset(&server_addr_hints, 0, sizeof(struct addrinfo));

    server_addr_hints.ai_family = AF_INET;

    server_addr_hints.ai_socktype = SOCK_STREAM;

    server_addr_hints.ai_
    fl
    ags = AI_PASSIVE;

    if ((addrinfoerr = getaddrinfo(HOST, PORT, &server_addr_hints, &server_addr)) < 0) {

    gai_strerror(addrinfoerr);

    }
    <$ͷ৔߹>αʔόʔΞυϨε৘ใऔಘ

    // ศ্ٓ"'@*/&5ʹ͍ͯ͠·͢
    ᶃΞυϨε৘ใͷώϯτΛ֨ೲ͢Δߏ଄ମͱ
    ɹΞυϨε৘ใΛ֨ೲ͢Δߏ଄ମͷͨΊͷϝϞϦྖҬΛ֬อ
    ᶄΞυϨε৘ใͷώϯτΛ֨ೲ͢Δߏ଄ମʹΞυϨε৘ใͷώϯτΛ֨ೲ
    ᶅΞυϨε৘ใͷώϯτΛ֨ೲͨ͠ߏ଄ମΛར༻ͯ͠
    ɹ࠷ॳʹݟ͔ͭͬͨΞυϨε৘ใΛΞυϨε৘ใΛ֨ೲ͢Δߏ଄ମʹ֨ೲ
    ɹ˞͜ͷͱ͖ɺΞυϨε৘ใ͸ϦϯΫϦετʹͳ͓ͬͯΓɺ
    ɹɹΞυϨε৘ใΛ֨ೲ͢Δߏ଄ମ͸ଞʹར༻Ͱ͖ΔީิͱͳΔ
    ɹɹΞυϨε৘ใ΁ͷϙΠϯλΛ͍࣋ͬͯΔ

    View Slide

  19. int listener;

    for (server_addr_tmp = server_addr;

    server_addr_tmp;

    server_addr_tmp = server_addr_tmp->ai_next) {

    listener = socket(server_addr_tmp->ai_family,

    server_addr_tmp->ai_socktype,

    server_addr_tmp->ai_protocol);

    if (listener < 0) continue;

    if (bind(listener, server_addr_tmp->ai_addr, server_addr_tmp->ai_addrlen) < 0) {

    close(listener);

    continue;

    }

    break;

    }
    <$ͷ৔߹>αʔόʔΞυϨε৘ใऔಘ

    View Slide

  20. int listener;

    for (server_addr_tmp = server_addr;

    server_addr_tmp;

    server_addr_tmp = server_addr_tmp->ai_next) {

    listener = socket(server_addr_tmp->ai_family,

    server_addr_tmp->ai_socktype,

    server_addr_tmp->ai_protocol);

    if (listener < 0) continue;

    if (bind(listener, server_addr_tmp->ai_addr, server_addr_tmp->ai_addrlen) < 0) {

    close(listener);

    continue;

    }

    break;

    }
    <$ͷ৔߹>αʔόʔΞυϨε৘ใऔಘ

    ᶆϦΫΤετΛ଴ͪड͚ΔιέοτͷͨΊͷϝϞϦྖҬΛ༻ҙ
    ᶇΞυϨε৘ใΛ֨ೲ͢Δߏ଄ମ͕࣋ͭϦϯΫΛͨͲͬͯ
    ɹ͜ͷߏ଄ମͷҰ෦ͷ৘ใ͔ΒιέοτΛ࡞੒͠ɺ
    ɹߋʹ͜ͷߏ଄ମͷଞͷ৘ใ͔Β࣮ࡍʹΞυϨεͱόΠϯυͰ͖Δ͔ࢼΈΔ
    ᶈιέοτͷ࡞੒ͱΞυϨεͷόΠϯυʹ੒ޭͨ͠ΒιέοτΛฦ͢

    View Slide

  21. int listener;

    for (server_addr_tmp = server_addr;

    server_addr_tmp;

    server_addr_tmp = server_addr_tmp->ai_next) {

    listener = socket(server_addr_tmp->ai_family,

    server_addr_tmp->ai_socktype,

    server_addr_tmp->ai_protocol);

    if (listener < 0) continue;

    if (bind(listener, server_addr_tmp->ai_addr, server_addr_tmp->ai_addrlen) < 0) {

    close(listener);

    continue;

    }

    break;

    }
    <$ͷ৔߹>αʔόʔΞυϨε৘ใऔಘ

    ᶆϦΫΤετΛ଴ͪड͚ΔιέοτͷͨΊͷϝϞϦྖҬΛ༻ҙ
    ᶇΞυϨε৘ใΛ֨ೲ͢Δߏ଄ମ͕࣋ͭϦϯΫΛͨͲͬͯ
    ɹ͜ͷߏ଄ମͷҰ෦ͷ৘ใ͔ΒιέοτΛ࡞੒͠ɺ
    ɹߋʹ͜ͷߏ଄ମͷଞͷ৘ใ͔Β࣮ࡍʹΞυϨεͱόΠϯυͰ͖Δ͔ࢼΈΔ
    ᶈιέοτͷ࡞੒ͱΞυϨεͷόΠϯυʹ੒ޭͨ͠ΒιέοτΛฦ͢
    ➡︎
    ೉͍͠ʜ
    ɹΞυϨεͷݕࡧͱιέοτͷ࡞੒Λಉ࣌ʹߦͬͯ
    ɹΞυϨεͷ༗ޮੑΛݕূ͢Δඞཁ͕͋Δ ޮ཰͕ѱ͍

    View Slide

  22. Addrinfo.getaddrinfo('localhost',

    12345,

    Socket::AF_INET,

    Socket::SOCK_STREAM,

    nil,

    Socket::AI_PASSIVE).
    fi
    rst

    <3VCZͷ৔߹>αʔόʔΞυϨε৘ใऔಘ
    BEESJOGPSC
    "EESJOGPΦϒδΣΫτΛͭ͘Δ͚ͩʂ
    "EESJOGPΦϒδΣΫτ͕༗ޮͳΞυϨε৘ใΛ͍࣋ͬͯΔ

    View Slide

  23. Addrinfo.getaddrinfo('localhost',

    12345,

    Socket::AF_INET,

    Socket::SOCK_STREAM,

    nil,

    Socket::AI_PASSIVE).
    fi
    rst

    <3VCZͷ৔߹>αʔόʔΞυϨε৘ใऔಘ
    BEESJOGPSC
    ͜ͷॲཧΛΤίʔαʔόʔͷ಺෦Ͱ࣮ߦ͠ɺ
    ιέοτΛ࡞੒͢Δ
    ฦΓ஋ͱͳΔ"EESJOGPΦϒδΣΫτ ͷΞυϨε৘ใ
    Λར༻ͯ͠

    View Slide

  24. 3VCZιʔείʔυΛΤίʔαʔόʔʹ૊ΈࠐΉ
    ΤίʔαʔόʔʹJODMVEFͯؔ͠਺ͱ࣮ͯ͠ߦ͢Δ
    BEESJOGPSC

    "EESJOGPHFUBEESJOGP
    Τίʔαʔόʔ $

    BEESJOGPD

    BEESJOGP

    BEESJOGP

    લड़ͷ3VCZιʔείʔυΛݩʹ$ؔ਺BEESJOGP
    Λ࡞੒͠ɺ

    View Slide

  25. NSVCZ͕༻ҙ͍ͯ͠ΔNSCDίϚϯυΛར༻͢Δ͜ͱͰ
    $ؔ਺BEESJOGP
    BEESJOGPD
    Λ؆୯ʹ࡞੒͢Δ͜ͱ͕Ͱ͖Δ
    ͜͏ͯ͠࡞੒ͨ͠BEESJOGP
    ؔ਺ΛΤίʔαʔόʔ͔Β࣮ߦ͢Δ
    ɹ $ mruby/bin/mrbc -Baddrinfo addrinfo.rb
    3VCZιʔείʔυ͔Β$ؔ਺Λ࡞੒͢Δ
    ؔ਺໊ͱιʔεϑΝΠϧΛ౉ͯ͠NSCDίϚϯυΛ࣮ߦ

    View Slide

  26. #include

    #include “addrinfo.c”

    mrb_state *mrb = mrb_open();

    // ͜͜Ͱ΍Δ͜ͱ

    // ɹɾBEESJOGP
    ؔ਺Λݺͼग़͢

    // ɹɾ"EESJOGPΦϒδΣΫτ͔ΒΞυϨε৘ใΛऔಘ͢Δ

    // ɾɹऔಘͨ͠ΞυϨε৘ใͰιέοτΛ࡞੒͢Δ

    mrb_close(mrb);
    FDIPTFSWFSD
    BEESJOGPDΛಡΈࠐΉͱɺ
    BEESJOGP
    ؔ਺͕ར༻Ͱ͖ΔΑ͏ʹͳΔ
    3VCZιʔείʔυΛΤίʔαʔόʔʹ૊ΈࠐΉ

    View Slide

  27. mrb_value addr = mrb_load_irep(mrb, addrinfo);

    mrb_value domain = mrb_funcall(mrb, addr, "afamily", 0);

    mrb_value socktype = mrb_funcall(mrb, addr, "socktype", 0);

    mrb_value protocol = mrb_funcall(mrb, addr, "protocol", 0);

    mrb_value port = mrb_funcall(mrb, addr, "ip_port", 0);

    mrb_value address = mrb_funcall(mrb, addr, "ip_address", 0);

    BEESJOGP
    ؔ਺Λݺͼग़͢
    FDIPTFSWFSD
    BEESJOGP
    ؔ਺Λ࣮ߦ͢Δͱ"EESJOGPΦϒδΣΫτ͕ฦͬͯ͘Δ

    View Slide

  28. mrb_value addr = mrb_load_irep(mrb, addrinfo);

    mrb_value domain = mrb_funcall(mrb, addr, "afamily", 0);

    mrb_value socktype = mrb_funcall(mrb, addr, "socktype", 0);

    mrb_value protocol = mrb_funcall(mrb, addr, "protocol", 0);

    mrb_value port = mrb_funcall(mrb, addr, "ip_port", 0);

    mrb_value address = mrb_funcall(mrb, addr, "ip_address", 0);

    "EESJOGPΦϒδΣΫτ͔ΒΞυϨε৘ใΛऔಘ͢Δ
    ͜ͷ"EESJOGPΦϒδΣΫτ͔Β
    ιέοτͷ࡞੒ʹඞཁͳ֤छΞυϨε৘ใΦϒδΣΫτΛऔಘ͢Δ
    FDIPTFSWFSD
    υϝΠϯ໊
    ιέοτλΠϓ
    ϓϩτίϧ
    ϙʔτ൪߸
    *1ΞυϨε

    View Slide

  29. mrb_value addr = mrb_load_irep(mrb, addrinfo);

    mrb_value domain = mrb_funcall(mrb, addr, "afamily", 0);

    mrb_value socktype = mrb_funcall(mrb, addr, "socktype", 0);

    mrb_value protocol = mrb_funcall(mrb, addr, "protocol", 0);

    mrb_value port = mrb_funcall(mrb, addr, "ip_port", 0);

    mrb_value address = mrb_funcall(mrb, addr, "ip_address", 0);

    ֤ΞυϨε৘ใΦϒδΣΫτ͸͜ͷޙɺ
    ιέοτΛ࡞੒͢Δ$ؔ਺ͷҾ਺ͱͯ͠࢖༻͞ΕΔ
    ͦͷࡍ3VCZΦϒδΣΫτ͔Β$ͷJOUܕʹม׵͓ͯ͘͠ඞཁ͕͋Δ
    FDIPTFSWFSD
    "EESJOGPΦϒδΣΫτ͔ΒΞυϨε৘ใΛऔಘ͢Δ
    υϝΠϯ໊
    ιέοτλΠϓ
    ϓϩτίϧ
    ϙʔτ൪߸
    *1ΞυϨε

    View Slide

  30. mrb_value addr = mrb_load_irep(mrb, addrinfo);

    mrb_value domain = mrb_funcall(mrb, addr, "afamily", 0);

    mrb_value socktype = mrb_funcall(mrb, addr, "socktype", 0);

    mrb_value protocol = mrb_funcall(mrb, addr, "protocol", 0);

    mrb_value port = mrb_funcall(mrb, addr, "ip_port", 0);

    mrb_value address = mrb_funcall(mrb, addr, "ip_address", 0);

    FDIPTFSWFSD
    "EESJOGPΦϒδΣΫτ͔ΒΞυϨε৘ใΛऔಘ͢Δ
    υϝΠϯ໊
    ιέοτλΠϓ
    ϓϩτίϧ
    ϙʔτ൪߸
    ͜͜·Ͱ͸*OUFHFSΦϒδΣΫτ
    *OUFHFSΦϒδΣΫτ͸NSVCZͷ$"1*Λར༻͢Δ͜ͱͰ
    $ͷJOUܕ΁ม׵͢Δ͜ͱ͕Ͱ͖Δ

    View Slide

  31. "EESJOGPΦϒδΣΫτ͔ΒΞυϨε৘ใΛऔಘ͢Δ
    mrb_value addr = mrb_load_irep(mrb, addrinfo);

    mrb_value domain = mrb_funcall(mrb, addr, "afamily", 0);

    mrb_value socktype = mrb_funcall(mrb, addr, "socktype", 0);

    mrb_value protocol = mrb_funcall(mrb, addr, "protocol", 0);

    mrb_value port = mrb_funcall(mrb, addr, "ip_port", 0);

    mrb_value address = mrb_funcall(mrb, addr, "ip_address", 0);

    FDIPTFSWFSD
    4USJOHΦϒδΣΫτ͸௚઀$ͷJOUܕ΁ม׵Ͱ͖ͳ͍
    FHlz

    *1ΞυϨε͸4USJOHΦϒδΣΫτ
    ͋Β͔͡Ί4USJOHΦϒδΣΫτ͔Β*OUFHFSΦϒδΣΫτ΁ม׵͢Δඞཁ͋Γ

    View Slide

  32. *1ΞυϨε จࣈྻ
    Λ*1ΞυϨε ਺஋
    ʹม׵͢Δ
    class Addr2Int

    RE_IPV4ADDRLIKE = %r{

    \A

    (\d+) \. (\d+) \. (\d+) \. (\d+)

    \z

    }x

    def self.convert(addr)

    m = RE_IPV4ADDRLIKE.match(addr)

    octets = m.captures

    octets.inject(0) { |i, s|

    (n = s.to_i) < 256

    s.match(/\A0./)

    i << 8 | n

    }

    end

    end
    BEESJOUSC
    ࢀߟIUUQTHJUIVCDPNSVCZJQBEESCMPCDDCFBECDDGEMJCJQBEESSC-
    *1ΞυϨεͷจࣈྻΛ਺஋ʹม׵͢Δ
    "EES*OUDPOWFSUϝιουΛ༻ҙ
    *1"EESFTTϥΠϒϥϦͷ[email protected]ϝιουͷ࣮૷Λ͓आΓͯ͠ʜ

    View Slide

  33. "EES*OUDPOWFSUϝιουΛ࣮૷ͨ͠ιʔεϑΝΠϧΛ
    Τίʔαʔόʔ಺͔ΒಡΈࠐΉ
    NSVCZͷ$"1*Λར༻ͯ͠"EES*OUDPOWFSUϝιουΛݺͼग़͢
    Τίʔαʔόʔ $

    BEESJOUSC

    "EES*OUDPOWFSU
    Τίʔαʔόʔ͔Β"EES*OUDPOWFSUϝιουΛݺͼग़͢
    "EES*OUDPOWFSU

    View Slide

  34. "EESJOGPΦϒδΣΫτ͔ΒΞυϨε৘ใΛऔಘ͢Δ
    mrb_value addr = mrb_load_irep(mrb, addrinfo);

    // …

    mrb_value address = mrb_funcall(mrb, addr, "ip_address", 0);

    FILE *addr2int_src = fopen("addr2int.rb", "r");

    mrb_load_
    fi
    le(mrb, addr2int_src);

    fclose(addr2int_src);

    mrb_value addr2int_klass = mrb_obj_value(mrb_class_get(mrb, "Addr2Int"));

    mrb_value inaddr = mrb_funcall(mrb, addr2int_klass, "convert", 1, address);

    FDIPTFSWFSD
    BEESJOUSCιʔεϑΝΠϧΛ
    ಡΈࠐΉ
    "EES*OUDPOWFSUϝιουʹ*1ΞυϨε จࣈྻ
    Λ౉࣮ͯ͠ߦ

    View Slide

  35. "EESJOGPΦϒδΣΫτ͔ΒΞυϨε৘ใΛऔಘ͢Δ
    mrb_value addr = mrb_load_irep(mrb, addrinfo);

    // …

    mrb_value address = mrb_funcall(mrb, addr, "ip_address", 0);

    FILE *addr2int_src = fopen("addr2int.rb", "r");

    mrb_load_
    fi
    le(mrb, addr2int_src);

    fclose(addr2int_src);

    mrb_value addr2int_klass = mrb_obj_value(mrb_class_get(mrb, "Addr2Int"));

    mrb_value inaddr = mrb_funcall(mrb, addr2int_klass, "convert", 1, address);

    FDIPTFSWFSD
    ➡︎
    *1ΞυϨεΛද͢*OUFHFSΦϒδΣΫτ͕ฦͬͯ͘Δ
    BEESJOUSCιʔεϑΝΠϧΛ
    ಡΈࠐΉ
    "EES*OUDPOWFSUϝιουʹ*1ΞυϨε จࣈྻ
    Λ౉࣮ͯ͠ߦ

    View Slide

  36. struct sockaddr_in saddr;

    saddr.sin_family = mrb_integer(domain);

    saddr.sin_addr.s_addr = htonl(mrb_integer(inaddr));

    saddr.sin_port = htons(mrb_integer(port));

    int listener;

    if ((listener = socket(mrb_integer(domain), mrb_integer(socktype), mrb_integer(protocol))) < 0) {

    perror("socket(2)");

    exit(1);

    }

    // …
    औಘͨ͠ΞυϨε৘ใͰιέοτΛ࡞੒͢Δ
    FDIPTFSWFSD
    ΞυϨε৘ใͷ*OUFHFSΦϒδΣΫτΛ$ͷJOUܕʹม׵͠ɺ
    ιέοτΛ࡞੒ ҎԼɺͦͷଞͷॲཧΛ࣮૷

    ม׵
    ιέοτ࡞੒
    ม׵
    ม׵
    ม׵
    ม׵ ม׵

    View Slide

  37. ׬੒
    αʔόʔ NSVCZͷMJCNSVCZBϑΝΠϧͱϦϯΫͯ͠ΤίʔαʔόʔΛίϯύΠϧ
    ΤίʔαʔόʔΛىಈ͢Δ

    View Slide

  38. ׬੒
    αʔόʔ
    ΫϥΠΞϯτ
    NSVCZͷMJCNSVCZBϑΝΠϧͱϦϯΫͯ͠ΤίʔαʔόʔΛίϯύΠϧ
    ΤίʔαʔόʔΛىಈ͢Δ
    ΫϥΠΞϯτ͔Βαʔόʔ΁ϝοηʔδΛૹ৴͢Δ

    View Slide

  39. ׬੒
    αʔόʔ
    αʔόʔ
    ΫϥΠΞϯτ
    NSVCZͷMJCNSVCZBϑΝΠϧͱϦϯΫͯ͠ΤίʔαʔόʔΛίϯύΠϧ
    ΤίʔαʔόʔΛىಈ͢Δ
    ΫϥΠΞϯτ͔Βαʔόʔ΁ϝοηʔδΛૹ৴͢Δ
    αʔόʔ͸ϝοηʔδΛड͚औΓɺͦͷ··ΫϥΠΞϯτ΁ฦ৴͢Δ

    View Slide

  40. ׬੒
    αʔόʔ
    αʔόʔ
    ΫϥΠΞϯτ
    NSVCZͷMJCNSVCZBϑΝΠϧͱϦϯΫͯ͠ΤίʔαʔόʔΛίϯύΠϧ
    ΤίʔαʔόʔΛىಈ͢Δ
    ΫϥΠΞϯτ͔Βαʔόʔ΁ϝοηʔδΛૹ৴͢Δ
    αʔόʔ͸ϝοηʔδΛड͚औΓɺͦͷ··ΫϥΠΞϯτ΁ฦ৴͢Δ
    ΫϥΠΞϯτ͸αʔόʔ͔Βͷฦ৴Λड͚औΔ

    View Slide

  41. ࢀߟਤॻ
    8FCͰ࢖͑Δ
    NSVCZγεςϜϓϩάϥϛϯάೖ໳
    ஶऀɿۙ౻Ӊஐ࿕
    IUUQTXXXDSDPNCPPLEFUBJM
    ೖ໳NSVCZ
    $͔ΒNSVCZ"1*Λ࢖͍͜ͳ͢
    ஶऀ:BNBOFLLP
    IUUQTCPPUIQNKBJUFNT

    View Slide

  42. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠

    View Slide

  43. View Slide

  44. View Slide

  45. View Slide

  46. View Slide