{"id":50908134,"url":"https://github.com/dujeonglee/networkcodingrev","last_synced_at":"2026-06-16T07:03:19.237Z","repository":{"id":196245902,"uuid":"80730407","full_name":"dujeonglee/NetworkCodingRev","owner":"dujeonglee","description":"Intra-session Network Coding Transport Protocol for IPv4 and IPv6","archived":false,"fork":false,"pushed_at":"2019-09-03T14:31:55.000Z","size":1854,"stargazers_count":7,"open_issues_count":1,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2023-09-23T20:10:50.378Z","etag":null,"topics":["best-effort","intrasession-network-coding","intrasession-networkcoding","ipv4-address","ipv4-support","ipv6-address","ipv6-support","network-coding","networkcoding","reliable-udp"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dujeonglee.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2017-02-02T14:03:16.000Z","updated_at":"2023-09-23T20:15:23.234Z","dependencies_parsed_at":null,"dependency_job_id":"ad62395a-ff31-4720-8d52-b899e45663ef","html_url":"https://github.com/dujeonglee/NetworkCodingRev","commit_stats":null,"previous_names":["dujeonglee/networkcodingrev"],"tags_count":9,"template":null,"template_full_name":null,"purl":"pkg:github/dujeonglee/NetworkCodingRev","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dujeonglee%2FNetworkCodingRev","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dujeonglee%2FNetworkCodingRev/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dujeonglee%2FNetworkCodingRev/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dujeonglee%2FNetworkCodingRev/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dujeonglee","download_url":"https://codeload.github.com/dujeonglee/NetworkCodingRev/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dujeonglee%2FNetworkCodingRev/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34393305,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-16T02:00:06.860Z","response_time":126,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["best-effort","intrasession-network-coding","intrasession-networkcoding","ipv4-address","ipv4-support","ipv6-address","ipv6-support","network-coding","networkcoding","reliable-udp"],"created_at":"2026-06-16T07:03:17.559Z","updated_at":"2026-06-16T07:03:19.224Z","avatar_url":"https://github.com/dujeonglee.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# NetworkCodingRev\n## Implementatioin of intra-session network coding. (This project deprecates NetworkCoding repo.)\n1. It supports both of reliable transmission and best-effort transmission.\n2. Packet order is preserved.\n3. Unlike tcp, data is not stream. Sender sends X bytes packet then receiver receives X bytes packet.\n4. It is easy to use. Please refer to main.cpp.\n5. It supports IPv4 and IPv6.\n6. Java native interface is supported.\n## Example code\n```\n#include \u003cstdio.h\u003e\n#include \u003cstring.h\u003e\n#include \u003csys/socket.h\u003e\n#include \u003cnetinet/in.h\u003e\n#include \u003ciostream\u003e\n#include \u003cthread\u003e\n#include \"api.h\"\n\nusing namespace std;\n\n#define USE_RX_CALLBACK (0)\n\nvoid SyncReceive(const char *port)\n{\n    std::cout \u003c\u003c __FUNCTION__ \u003c\u003c std::endl;\n    FILE *p_File = nullptr;\n    float mbyte_received = 0;\n    float total_mbyte_received = 0;\n    uint32_t samples = 0;\n\n    uint8_t buffer[1500];\n    uint16_t buffer_length = sizeof(buffer);\n    union {\n        sockaddr_in ip4;\n        sockaddr_in6 ip6;\n    } addr;\n    uint32_t addr_length = sizeof(addr);\n\n    void *handle = InitSocket(port, 500, 500, nullptr);\n    const bool ret = Receive(handle, buffer, \u0026buffer_length, \u0026addr, \u0026addr_length, 0);\n    if (ret)\n    {\n        buffer[buffer_length] = 0;\n        p_File = fopen((char *)buffer, \"w\");\n        if (p_File)\n        {\n            std::cout \u003c\u003c \"Create File \" \u003c\u003c (char *)buffer \u003c\u003c std::endl;\n        }\n        else\n        {\n            std::cout \u003c\u003c \"Cannot create file \" \u003c\u003c (char *)buffer \u003c\u003c std::endl;\n            exit(-1);\n        }\n    }\n    std::thread bwchk = std::thread([\u0026p_File, \u0026total_mbyte_received, \u0026mbyte_received, \u0026samples]() {\n        while (p_File)\n        {\n            std::this_thread::sleep_for(std::chrono::seconds(1));\n            total_mbyte_received += mbyte_received;\n            mbyte_received = 0;\n            samples++;\n            printf(\"[AVG %5.5f MB/s][%u seconds]\\n\", total_mbyte_received / samples, samples);\n            fflush(stdout);\n        }\n    });\n    bwchk.detach();\n    do\n    {\n        buffer_length = sizeof(buffer);\n        addr_length = sizeof(addr);\n        if (Receive(handle, buffer, \u0026buffer_length, \u0026addr, \u0026addr_length, 0))\n        {\n            if (!(buffer_length == 1 \u0026\u0026 buffer[0] == 0xff))\n            {\n                fwrite(buffer, 1, buffer_length, p_File);\n                mbyte_received += ((float)buffer_length / (1000000.));\n            }\n        }\n\n    } while (!(buffer_length == 1 \u0026\u0026 buffer[0] == 0xff));\n    fclose(p_File);\n    p_File = nullptr;\n    FreeSocket(handle);\n    handle = nullptr;\n}\n\nvoid AsyncReceive(const char *port)\n{\n    std::cout \u003c\u003c __FUNCTION__ \u003c\u003c std::endl;\n    FILE *p_File = nullptr;\n    float mbyte_received = 0;\n    float total_mbyte_received = 0;\n    uint32_t samples = 0;\n\n    bool done = false;\n    void *handle = InitSocket(\n        port,\n        500,\n        500,\n        [\u0026p_File, \u0026total_mbyte_received, \u0026mbyte_received, \u0026samples, \u0026done](uint8_t *const buffer, const uint16_t length, const void *const address, const uint32_t sender_addr_len) {\n            if (p_File == nullptr)\n            {\n                buffer[length] = 0;\n                p_File = fopen((char *)buffer, \"w\");\n                std::thread bwchk = std::thread([\u0026total_mbyte_received, \u0026mbyte_received, \u0026samples, \u0026done]() {\n                    while (!done)\n                    {\n                        std::this_thread::sleep_for(std::chrono::seconds(1));\n                        total_mbyte_received += mbyte_received;\n                        mbyte_received = 0;\n                        samples++;\n                        printf(\"[AVG %5.5f MB/s][%u seconds]\\n\", total_mbyte_received / samples, samples);\n                        fflush(stdout);\n                    }\n                });\n                bwchk.detach();\n            }\n            else\n            {\n                if (!(length == 1 \u0026\u0026 buffer[0] == 0xff))\n                {\n                    fwrite(buffer, 1, length, p_File);\n                    mbyte_received += ((float)length / (1000000.));\n                }\n                else\n                {\n                    done = true;\n                }\n            }\n        });\n    while (!done)\n    {\n        std::this_thread::sleep_for(std::chrono::milliseconds(500));\n    }\n    fclose(p_File);\n    p_File = nullptr;\n    FreeSocket(handle);\n    handle = nullptr;\n}\n\nint main(int argc, char *argv[])\n{\n    if (argc == 3)\n    {\n        std::cout \u003c\u003c \"Receive Mode\" \u003c\u003c std::endl;\n        if (std::string(argv[1]).compare(\"Sync\") == 0)\n        {\n            SyncReceive(argv[2]);\n        }\n        else if (std::string(argv[1]).compare(\"Async\") == 0)\n        {\n            AsyncReceive(argv[2]);\n        }\n        else\n        {\n            std::cout \u003c\u003c \"Invalid receive mode \" \u003c\u003c argv[1] \u003c\u003c std::endl;\n        }\n    }\n    else if (argc == 5)\n    {\n        std::cout \u003c\u003c \"Send Mode\" \u003c\u003c std::endl;\n        void *handle = InitSocket(argv[1], 500, 500, nullptr);\n        do\n        {\n            std::cout \u003c\u003c \"Connect to \" \u003c\u003c argv[2] \u003c\u003c \":\" \u003c\u003c argv[3] \u003c\u003c \".\" \u003c\u003c std::endl;\n        } while (false == Connect(handle, argv[2], argv[3], 1000, 0, 32, 0));\n\n        FILE *p_File = nullptr;\n        p_File = fopen(argv[4], \"r\");\n        if (p_File == nullptr)\n        {\n            std::cout \u003c\u003c \"Cannot open file \" \u003c\u003c argv[4] \u003c\u003c std::endl;\n            exit(-1);\n        }\n\n        unsigned char buffer[1424];\n        size_t readbytes;\n        Send(handle, argv[2], argv[3], (unsigned char *)argv[4], strlen(argv[4]));\n        while ((readbytes = fread(buffer, 1, sizeof(buffer), p_File)) \u003e 0)\n        {\n            Send(handle, argv[2], argv[3], buffer, readbytes);\n        }\n        buffer[0] = 0xff;\n        Send(handle, argv[2], argv[3], buffer, 1);\n        WaitUntilTxIsCompleted(handle, argv[2], argv[3]);\n        fclose(p_File);\n        FreeSocket(handle);\n    }\n    else\n    {\n        std::cout \u003c\u003c \"Send Mode: run localport remoteIP remoteport filename\" \u003c\u003c std::endl;\n        std::cout \u003c\u003c \"Receive Mode: run {Sync, Async} localport\" \u003c\u003c std::endl;\n    }\n    return 0;\n}\n\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdujeonglee%2Fnetworkcodingrev","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdujeonglee%2Fnetworkcodingrev","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdujeonglee%2Fnetworkcodingrev/lists"}