CINXE.COM
erpc module - github.com/andeya/erpc/v7 - Go Packages
<!DOCTYPE html> <html lang="en" data-layout="responsive" data-local=""> <head> <script> window.addEventListener('error', window.__err=function f(e){f.p=f.p||[];f.p.push(e)}); </script> <script> (function() { const theme = document.cookie.match(/prefers-color-scheme=(light|dark|auto)/)?.[1] if (theme) { document.querySelector('html').setAttribute('data-theme', theme); } }()) </script> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta class="js-gtmID" data-gtmid="GTM-W8MVQXG"> <link rel="shortcut icon" href="/static/shared/icon/favicon.ico"> <link rel="canonical" href="https://pkg.go.dev/github.com/andeya/erpc/v7"> <link href="/static/frontend/frontend.min.css?version=prod-frontend-00098-h5t" rel="stylesheet"> <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="Go Packages"> <title>erpc module - github.com/andeya/erpc/v7 - Go Packages</title> <link href="/static/frontend/unit/unit.min.css?version=prod-frontend-00098-h5t" rel="stylesheet"> <link href="/static/frontend/unit/main/main.min.css?version=prod-frontend-00098-h5t" rel="stylesheet"> </head> <body> <script> function loadScript(src, mod = true) { let s = document.createElement('script'); s.src = src; if (mod) { s.type = 'module'; s.async = true; s.defer = true } document.head.appendChild(s); } loadScript("/third_party/dialog-polyfill/dialog-polyfill.js", false) loadScript("/static/frontend/frontend.js"); </script> <header class="go-Header go-Header--full js-siteHeader"> <div class="go-Header-inner go-Header-inner--dark"> <nav class="go-Header-nav"> <a href="https://go.dev/" class="js-headerLogo" data-gtmc="nav link" data-test-id="go-header-logo-link" role="heading" aria-level="1"> <img class="go-Header-logo" src="/static/shared/logo/go-white.svg" alt="Go"> </a> <div class="skip-navigation-wrapper"> <a class="skip-to-content-link" aria-label="Skip to main content" href="#main-content"> Skip to Main Content </a> </div> <div class="go-Header-rightContent"> <div class="go-SearchForm js-searchForm"> <form class="go-InputGroup go-ShortcutKey go-SearchForm-form" action="/search" data-shortcut="/" data-shortcut-alt="search" data-gtmc="search form" aria-label="Search for a package" role="search" > <input name="q" class="go-Input js-searchFocus" aria-label="Search for a package" type="search" autocapitalize="off" autocomplete="off" autocorrect="off" spellcheck="false" placeholder="Search packages or symbols" value="" /> <input name="m" value="" hidden> <button class="go-Button go-Button--inverted" aria-label="Submit search"> <img class="go-Icon" height="24" width="24" src="/static/shared/icon/search_gm_grey_24dp.svg" alt="" /> </button> </form> <button class="go-SearchForm-expandSearch js-expandSearch" data-gtmc="nav button" aria-label="Open search" data-test-id="expand-search"> <img class="go-Icon go-Icon--inverted" height="24" width="24" src="/static/shared/icon/search_gm_grey_24dp.svg" alt=""> </button> </div> <ul class="go-Header-menu"> <li class="go-Header-menuItem"> <a class="js-desktop-menu-hover" href="#" data-gtmc="nav link"> Why Go <img class="go-Icon" height="24" width="24" src="/static/shared/icon/arrow_drop_down_gm_grey_24dp.svg" alt="submenu dropdown icon"> </a> <ul class="go-Header-submenu go-Header-submenu--why js-desktop-submenu-hover" aria-label="submenu"> <li class="go-Header-submenuItem"> <div> <a href="https://go.dev/solutions#case-studies"> <span>Case Studies</span> </a> </div> <p>Common problems companies solve with Go</p> </li> <li class="go-Header-submenuItem"> <div> <a href="https://go.dev/solutions#use-cases"> <span>Use Cases</span> </a> </div> <p>Stories about how and why companies use Go</p> </li> <li class="go-Header-submenuItem"> <div> <a href="https://go.dev/security/"> <span>Security</span> </a> </div> <p>How Go can help keep you secure by default</p> </li> </ul> </li> <li class="go-Header-menuItem"> <a href="https://go.dev/learn/" data-gtmc="nav link">Learn</a> </li> <li class="go-Header-menuItem"> <a class="js-desktop-menu-hover" href="#" data-gtmc="nav link"> Docs <img class="go-Icon" height="24" width="24" src="/static/shared/icon/arrow_drop_down_gm_grey_24dp.svg" alt="submenu dropdown icon"> </a> <ul class="go-Header-submenu go-Header-submenu--docs js-desktop-submenu-hover" aria-label="submenu"> <li class="go-Header-submenuItem"> <div> <a href="https://go.dev/doc/effective_go"> <span>Effective Go</span> </a> </div> <p>Tips for writing clear, performant, and idiomatic Go code</p> </li> <li class="go-Header-submenuItem"> <div> <a href="https://go.dev/doc/"> <span>Go User Manual</span> </a> </div> <p>A complete introduction to building software with Go</p> </li> <li class="go-Header-submenuItem"> <div> <a href="https://pkg.go.dev/std"> <span>Standard library</span> </a> </div> <p>Reference documentation for Go's standard library</p> </li> <li class="go-Header-submenuItem"> <div> <a href="https://go.dev/doc/devel/release"> <span>Release Notes</span> </a> </div> <p>Learn what's new in each Go release</p> </li> </ul> </li> <li class="go-Header-menuItem go-Header-menuItem--active"> <a href="/" data-gtmc="nav link">Packages</a> </li> <li class="go-Header-menuItem"> <a class="js-desktop-menu-hover" href="#" data-gtmc="nav link"> Community <img class="go-Icon" height="24" width="24" src="/static/shared/icon/arrow_drop_down_gm_grey_24dp.svg" alt="submenu dropdown icon"> </a> <ul class="go-Header-submenu go-Header-submenu--community js-desktop-submenu-hover" aria-label="submenu"> <li class="go-Header-submenuItem"> <div> <a href="https://go.dev/talks/"> <span>Recorded Talks</span> </a> </div> <p>Videos from prior events</p> </li> <li class="go-Header-submenuItem"> <div> <a href="https://www.meetup.com/pro/go"> <span>Meetups</span> <i class="material-icons"> <img class="go-Icon" height="24" width="24" src="/static/shared/icon/launch_gm_grey_24dp.svg" alt=""> </i> </a> </div> <p>Meet other local Go developers</p> </li> <li class="go-Header-submenuItem"> <div> <a href="https://github.com/golang/go/wiki/Conferences"> <span>Conferences</span> <i class="material-icons"> <img class="go-Icon" height="24" width="24" src="/static/shared/icon/launch_gm_grey_24dp.svg" alt=""> </i> </a> </div> <p>Learn and network with Go developers from around the world</p> </li> <li class="go-Header-submenuItem"> <div> <a href="https://go.dev/blog"> <span>Go blog</span> </a> </div> <p>The Go project's official blog.</p> </li> <li class="go-Header-submenuItem"> <div> <a href="https://go.dev/help"> <span>Go project</span> </a> </div> <p>Get help and stay informed from Go</p> </li> <li class="go-Header-submenuItem"> <div> Get connected </div> <p></p> <div class="go-Header-socialIcons"> <a class="go-Header-socialIcon" aria-label="Get connected with google-groups (Opens in new window)" title="Get connected with google-groups (Opens in new window)" href="https://groups.google.com/g/golang-nuts"> <img src="/static/shared/logo/social/google-groups.svg" /> </a> <a class="go-Header-socialIcon" aria-label="Get connected with github (Opens in new window)" title="Get connected with github (Opens in new window)" href="https://github.com/golang"> <img src="/static/shared/logo/social/github.svg" /> </a> <a class="go-Header-socialIcon" aria-label="Get connected with twitter (Opens in new window)" title="Get connected with twitter (Opens in new window)" href="https://twitter.com/golang"> <img src="/static/shared/logo/social/twitter.svg" /> </a> <a class="go-Header-socialIcon" aria-label="Get connected with reddit (Opens in new window)" title="Get connected with reddit (Opens in new window)" href="https://www.reddit.com/r/golang/"> <img src="/static/shared/logo/social/reddit.svg" /> </a> <a class="go-Header-socialIcon" aria-label="Get connected with slack (Opens in new window)" title="Get connected with slack (Opens in new window)" href="https://invite.slack.golangbridge.org/"> <img src="/static/shared/logo/social/slack.svg" /> </a> <a class="go-Header-socialIcon" aria-label="Get connected with stack-overflow (Opens in new window)" title="" href="https://stackoverflow.com/collectives/go"> <img src="/static/shared/logo/social/stack-overflow.svg" /> </a> </div> </li> </ul> </li> </ul> <button class="go-Header-navOpen js-headerMenuButton go-Header-navOpen--white" data-gtmc="nav button" aria-label="Open navigation"> </button> </div> </nav> </div> </header> <aside class="go-NavigationDrawer js-header"> <nav class="go-NavigationDrawer-nav"> <div class="go-NavigationDrawer-header"> <a href="https://go.dev/"> <img class="go-NavigationDrawer-logo" src="/static/shared/logo/go-blue.svg" alt="Go."> </a> </div> <ul class="go-NavigationDrawer-list"> <li class="go-NavigationDrawer-listItem js-mobile-subnav-trigger go-NavigationDrawer-hasSubnav"> <a href="#"> <span>Why Go</span> <i class="material-icons"> <img class="go-Icon" height="24" width="24" src="/static/shared/icon/navigate_next_gm_grey_24dp.svg" alt=""> </i> </a> <div class="go-NavigationDrawer go-NavigationDrawer-submenuItem"> <div class="go-NavigationDrawer-nav"> <div class="go-NavigationDrawer-header"> <a href="#"> <i class="material-icons"> <img class="go-Icon" height="24" width="24" src="/static/shared/icon/navigate_before_gm_grey_24dp.svg" alt=""> </i> Why Go </a> </div> <ul class="go-NavigationDrawer-list"> <li class="go-NavigationDrawer-listItem"> <a href="https://go.dev/solutions#case-studies"> Case Studies </a> </li> <li class="go-NavigationDrawer-listItem"> <a href="https://go.dev/solutions#use-cases"> Use Cases </a> </li> <li class="go-NavigationDrawer-listItem"> <a href="https://go.dev/security/"> Security </a> </li> </ul> </div> </div> </li> <li class="go-NavigationDrawer-listItem"> <a href="https://go.dev/learn/">Learn</a> </li> <li class="go-NavigationDrawer-listItem js-mobile-subnav-trigger go-NavigationDrawer-hasSubnav"> <a href="#"> <span>Docs</span> <i class="material-icons"> <img class="go-Icon" height="24" width="24" src="/static/shared/icon/navigate_next_gm_grey_24dp.svg" alt=""> </i> </a> <div class="go-NavigationDrawer go-NavigationDrawer-submenuItem"> <div class="go-NavigationDrawer-nav"> <div class="go-NavigationDrawer-header"> <a href="#"><i class="material-icons"> <img class="go-Icon" height="24" width="24" src="/static/shared/icon/navigate_before_gm_grey_24dp.svg" alt=""> </i> Docs </a> </div> <ul class="go-NavigationDrawer-list"> <li class="go-NavigationDrawer-listItem"> <a href="https://go.dev/doc/effective_go"> Effective Go </a> </li> <li class="go-NavigationDrawer-listItem"> <a href="https://go.dev/doc/"> Go User Manual </a> </li> <li class="go-NavigationDrawer-listItem"> <a href="https://pkg.go.dev/std"> Standard library </a> </li> <li class="go-NavigationDrawer-listItem"> <a href="https://go.dev/doc/devel/release"> Release Notes </a> </li> </ul> </div> </div> </li> <li class="go-NavigationDrawer-listItem go-NavigationDrawer-listItem--active"> <a href="/">Packages</a> </li> <li class="go-NavigationDrawer-listItem js-mobile-subnav-trigger go-NavigationDrawer-hasSubnav"> <a href="#"> <span>Community</span> <i class="material-icons"> <img class="go-Icon" height="24" width="24" src="/static/shared/icon/navigate_next_gm_grey_24dp.svg" alt=""> </i> </a> <div class="go-NavigationDrawer go-NavigationDrawer-submenuItem"> <div class="go-NavigationDrawer-nav"> <div class="go-NavigationDrawer-header"> <a href="#"> <i class="material-icons"> <img class="go-Icon" height="24" width="24" src="/static/shared/icon/navigate_before_gm_grey_24dp.svg" alt=""> </i> Community </a> </div> <ul class="go-NavigationDrawer-list"> <li class="go-NavigationDrawer-listItem"> <a href="https://go.dev/talks/"> Recorded Talks </a> </li> <li class="go-NavigationDrawer-listItem"> <a href="https://www.meetup.com/pro/go"> Meetups <i class="material-icons"> <img class="go-Icon" height="24" width="24" src="/static/shared/icon/launch_gm_grey_24dp.svg" alt=""> </i> </a> </li> <li class="go-NavigationDrawer-listItem"> <a href="https://github.com/golang/go/wiki/Conferences"> Conferences <i class="material-icons"> <img class="go-Icon" height="24" width="24" src="/static/shared/icon/launch_gm_grey_24dp.svg" alt=""> </i> </a> </li> <li class="go-NavigationDrawer-listItem"> <a href="https://go.dev/blog"> Go blog </a> </li> <li class="go-NavigationDrawer-listItem"> <a href="https://go.dev/help"> Go project </a> </li> <li class="go-NavigationDrawer-listItem"> <div>Get connected</div> <div class="go-Header-socialIcons"> <a class="go-Header-socialIcon" href="https://groups.google.com/g/golang-nuts"><img src="/static/shared/logo/social/google-groups.svg" /></a> <a class="go-Header-socialIcon" href="https://github.com/golang"><img src="/static/shared/logo/social/github.svg" /></a> <a class="go-Header-socialIcon" href="https://twitter.com/golang"><img src="/static/shared/logo/social/twitter.svg" /></a> <a class="go-Header-socialIcon" href="https://www.reddit.com/r/golang/"><img src="/static/shared/logo/social/reddit.svg" /></a> <a class="go-Header-socialIcon" href="https://invite.slack.golangbridge.org/"><img src="/static/shared/logo/social/slack.svg" /></a> <a class="go-Header-socialIcon" href="https://stackoverflow.com/collectives/go"><img src="/static/shared/logo/social/stack-overflow.svg" /></a> </div> </li> </ul> </div> </div> </li> </ul> </nav> </aside> <div class="go-NavigationDrawer-scrim js-scrim" role="presentation"></div> <main class="go-Main" id="main-content"> <div class="go-Main-banner" role="alert"></div> <header class="go-Main-header js-mainHeader"> <nav class="go-Main-headerBreadcrumb go-Breadcrumb" aria-label="Breadcrumb" data-test-id="UnitHeader-breadcrumb"> <ol> <li data-test-id="UnitHeader-breadcrumbItem"> <a href="/" data-gtmc="breadcrumb link">Discover Packages</a> </li> <li> <a href="/github.com/andeya/erpc/v7@v7.2.2" data-gtmc="breadcrumb link" aria-current="location" data-test-id="UnitHeader-breadcrumbCurrent"> github.com/andeya/erpc/v7 </a> <button class="go-Button go-Button--inline go-Clipboard js-clipboard" title="Copy path to clipboard. github.com/andeya/erpc/v7" aria-label="Copy Path to Clipboard" data-to-copy="github.com/andeya/erpc/v7" data-gtmc="breadcrumbs button" > <img class="go-Icon go-Icon--accented" height="24" width="24" src="/static/shared/icon/content_copy_gm_grey_24dp.svg" alt="" > </button> </li> </ol> </nav> <div class="go-Main-headerContent"> <div class="go-Main-headerTitle js-stickyHeader"> <a class="go-Main-headerLogo" href="https://go.dev/" aria-hidden="true" tabindex="-1" data-gtmc="header link" aria-label="Link to Go Homepage"> <img height="78" width="207" src="/static/shared/logo/go-blue.svg" alt="Go"> </a> <h1 class="UnitHeader-titleHeading" data-test-id="UnitHeader-title">erpc</h1> <span class="go-Chip go-Chip--inverted">module</span> <button class="go-Button go-Button--inline go-Clipboard js-clipboard" title="Copy path to clipboard. github.com/andeya/erpc/v7" aria-label="Copy Path to Clipboard" data-to-copy="github.com/andeya/erpc/v7" data-gtmc="title button" tabindex="-1" > <img class="go-Icon go-Icon--accented" height="24" width="24" src="/static/shared/icon/content_copy_gm_grey_24dp.svg" alt="" /> </button> </div> <div class="go-Main-headerDetails"> <span class="go-Main-headerDetailItem" data-test-id="UnitHeader-version"> <a href="?tab=versions" aria-label="Version: v7.2.2" data-gtmc="header link" aria-describedby="version-description"> <span class="go-textSubtle" aria-hidden="true">Version: </span> v7.2.2 </a> <div class="screen-reader-only" id="version-description" hidden> Opens a new window with list of versions in this module. </div> <span class="DetailsHeader-badge--latest" data-test-id="UnitHeader-minorVersionBanner"> <span class="go-Chip DetailsHeader-span--latest">Latest</span> <span class="go-Chip DetailsHeader-span--notAtLatest"> Latest <details class="go-Tooltip js-tooltip" data-gtmc="tooltip"> <summary> <img class="go-Icon go-Icon--inverted" height="24" width="24" src="/static/shared/icon/alert_gm_grey_24dp.svg" alt="Warning"> </summary> <p>This package is not in the latest version of its module.</p> </details> </span> <a href="/github.com/andeya/erpc/v7" aria-label="Go to Latest Version" data-gtmc="header link"> <span class="go-Chip go-Chip--alert DetailsHeader-span--goToLatest">Go to latest</span> </a> </span> </span> <span class="go-Main-headerDetailItem" data-test-id="UnitHeader-commitTime"> Published: Dec 12, 2024 </span> <span class="go-Main-headerDetailItem" data-test-id="UnitHeader-licenses"> License: <a href="/github.com/andeya/erpc/v7?tab=licenses" data-test-id="UnitHeader-license" data-gtmc="header link" aria-describedby="license-description">Apache-2.0</a> </span> <div class="screen-reader-only" id="license-description" hidden> Opens a new window with license information. </div> </div> <div class="UnitHeader-overflowContainer"> <svg class="UnitHeader-overflowImage" xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"> <path d="M0 0h24v24H0z" fill="none"/> <path d="M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/> </svg> <select class="UnitHeader-overflowSelect js-selectNav" tabindex="-1"> <option value="/">Main</option> <option value="/github.com/andeya/erpc/v7?tab=versions"> Versions </option> <option value="/github.com/andeya/erpc/v7?tab=licenses"> Licenses </option> </select> </div> </div> </header> <aside class="go-Main-aside js-mainAside"> <div class="UnitMeta"> <h2 class="go-textLabel">Details</h2> <ul class="UnitMeta-details"> <li> <details class="go-Tooltip js-tooltip" data-gtmc="tooltip"> <summary class="go-textSubtle"> <img class="go-Icon go-Icon--accented" tabindex="0" role="button"src="/static/shared/icon/check_circle_gm_grey_24dp.svg" alt="checked" aria-label="Valid file, toggle tooltip"height="24" width="24"> Valid <a href="https://github.com/andeya/erpc/tree/v7.2.2/go.mod" target="_blank" rel="noopener">go.mod</a> file <img class="go-Icon" role="button" tabindex="0" src="/static/shared/icon/help_gm_grey_24dp.svg" alt="" aria-label="Toggle go.mod validity tooltip" height="24" width="24"> </summary> <p aria-live="polite" role="tooltip"> The Go module system was introduced in Go 1.11 and is the official dependency management solution for Go. </p> </details> </li> <li> <details class="go-Tooltip js-tooltip" data-gtmc="tooltip"> <summary class="go-textSubtle"> <img class="go-Icon go-Icon--accented" tabindex="0" role="button"src="/static/shared/icon/check_circle_gm_grey_24dp.svg" alt="checked" aria-label="Valid file, toggle tooltip"height="24" width="24"> Redistributable license <img class="go-Icon" role="button" tabindex="0" src="/static/shared/icon/help_gm_grey_24dp.svg" alt="" aria-label="Toggle redistributable help tooltip" height="24" width="24"> </summary> <p aria-live="polite" role="tooltip"> Redistributable licenses place minimal restrictions on how software can be used, modified, and redistributed. </p> </details> </li> <li> <details class="go-Tooltip js-tooltip" data-gtmc="tooltip"> <summary class="go-textSubtle"> <img class="go-Icon go-Icon--accented" tabindex="0" role="button"src="/static/shared/icon/check_circle_gm_grey_24dp.svg" alt="checked" aria-label="Valid file, toggle tooltip"height="24" width="24"> Tagged version <img class="go-Icon" role="button" tabindex="0" src="/static/shared/icon/help_gm_grey_24dp.svg" alt="" aria-label="Toggle tagged version tooltip" height="24" width="24"> </summary> <p aria-live="polite" role="tooltip">Modules with tagged versions give importers more predictable builds.</p> </details> </li> <li> <details class="go-Tooltip js-tooltip" data-gtmc="tooltip"> <summary class="go-textSubtle"> <img class="go-Icon go-Icon--accented" tabindex="0" role="button"src="/static/shared/icon/check_circle_gm_grey_24dp.svg" alt="checked" aria-label="Valid file, toggle tooltip"height="24" width="24"> Stable version <img class="go-Icon" role="button" tabindex="0" aria-label="Toggle stable version tooltip" src="/static/shared/icon/help_gm_grey_24dp.svg" alt="" height="24" width="24"> </summary> <p aria-live="polite" role="tooltip">When a project reaches major version v1 it is considered stable.</p> </details> </li> <li class="UnitMeta-detailsLearn"> <a href="/about#best-practices" data-gtmc="meta link">Learn more about best practices</a> </li> </ul> <h2 class="go-textLabel">Repository</h2> <div class="UnitMeta-repo"> <a href="https://github.com/andeya/erpc" title="https://github.com/andeya/erpc" target="_blank" rel="noopener"> github.com/andeya/erpc </a> </div> <h2 class="go-textLabel" data-test-id="links-heading">Links</h2> <ul class="UnitMeta-links"> <li> <a href="https://deps.dev/go/github.com%2Fandeya%2Ferpc%2Fv7/v7.2.2" title="View this module on Open Source Insights" target="_blank" rel="noopener" data-test-id="meta-link-depsdev"> <img class="depsdev-Icon" src="/static/shared/icon/depsdev-logo.svg" alt="Open Source Insights Logo" /> Open Source Insights </a> </li> </ul> </div> </aside> <nav class="go-Main-nav go-Main-nav--sticky js-mainNav" aria-label="Outline"> <div class="go-Main-navDesktop"> <div class="UnitOutline-jumpTo"> <button class="UnitOutline-jumpToInput go-ShortcutKey js-jumpToInput" aria-controls="jump-to-modal" aria-label="Open Jump to Identifier" data-shortcut="f" data-shortcut-alt="find" data-test-id="jump-to-button" data-gtmc="outline button"> Jump to ... </button> </div> <ul class="go-Tree js-tree" role="tree" aria-label="Outline"> <li class="js-readmeOutline"> <a href="#section-readme" data-gtmc="outline link"> README </a> <ul id="readme-outline"> <li> <a href="#readme-install" data-gtmc="readme outline link"> Install </a> </li> <li> <a href="#readme-feature" data-gtmc="readme outline link"> Feature </a> </li> <li> <a href="#readme-benchmark" data-gtmc="readme outline link"> Benchmark </a> </li> <li> <a href="#readme-example" data-gtmc="readme outline link"> Example </a> <ul> <li> <a href="#readme-server-go" data-gtmc="readme outline link"> server.go </a> </li> <li> <a href="#readme-client-go" data-gtmc="readme outline link"> client.go </a> </li> </ul> </li> <li> <a href="#readme-usage" data-gtmc="readme outline link"> Usage </a> <ul> <li> <a href="#readme-peer-server-or-client-demo" data-gtmc="readme outline link"> Peer(server or client) Demo </a> </li> <li> <a href="#readme-call-struct-api-template" data-gtmc="readme outline link"> Call-Struct API template </a> </li> <li> <a href="#readme-service-method-mapping" data-gtmc="readme outline link"> Service method mapping </a> </li> <li> <a href="#readme-call-function-api-template" data-gtmc="readme outline link"> Call-Function API template </a> </li> <li> <a href="#readme-push-struct-api-template" data-gtmc="readme outline link"> Push-Struct API template </a> </li> <li> <a href="#readme-push-function-api-template" data-gtmc="readme outline link"> Push-Function API template </a> </li> <li> <a href="#readme-unknown-call-function-api-template" data-gtmc="readme outline link"> Unknown-Call-Function API template </a> </li> <li> <a href="#readme-unknown-push-function-api-template" data-gtmc="readme outline link"> Unknown-Push-Function API template </a> </li> <li> <a href="#readme-plugin-demo" data-gtmc="readme outline link"> Plugin Demo </a> </li> <li> <a href="#readme-register-above-handler-and-plugin" data-gtmc="readme outline link"> Register above handler and plugin </a> </li> <li> <a href="#readme-config" data-gtmc="readme outline link"> Config </a> </li> <li> <a href="#readme-optimize" data-gtmc="readme outline link"> Optimize </a> </li> </ul> </li> <li> <a href="#readme-extensions" data-gtmc="readme outline link"> Extensions </a> <ul> <li> <a href="#readme-codec" data-gtmc="readme outline link"> Codec </a> </li> <li> <a href="#readme-plugin" data-gtmc="readme outline link"> Plugin </a> </li> <li> <a href="#readme-protocol" data-gtmc="readme outline link"> Protocol </a> </li> <li> <a href="#readme-transfer-filter" data-gtmc="readme outline link"> Transfer-Filter </a> </li> <li> <a href="#readme-mixer" data-gtmc="readme outline link"> Mixer </a> </li> </ul> </li> <li> <a href="#readme-projects-based-on-erpc" data-gtmc="readme outline link"> Projects based on eRPC </a> </li> <li> <a href="#readme-business-users" data-gtmc="readme outline link"> Business Users </a> </li> <li> <a href="#readme-license" data-gtmc="readme outline link"> License </a> </li> </ul> </li> <li> <a href="#section-directories" data-gtmc="outline link"> Directories </a> </li> </ul> </div> <div class="go-Main-navMobile js-mainNavMobile"> <label class="go-Label"> <select class="go-Select"> <option selected disabled>README</option> </select> </label> </div> </nav> <article class="go-Main-article js-mainContent"> <div class="UnitDetails" data-test-id="UnitDetails" style="display: block;"> <div class="UnitDetails-content js-unitDetailsContent" data-test-id="UnitDetails-content"> <div class="UnitReadme UnitReadme--expanded js-readme"> <h2 class="UnitReadme-title" id="section-readme"> <img class="go-Icon" height="24" width="24" src="/static/shared/icon/chrome_reader_mode_gm_grey_24dp.svg" alt=""> README <a class="UnitReadme-idLink" href="#section-readme" title="Go to Readme" aria-label="Go to Readme">¶</a> </h2> <div class="UnitReadme-content" data-test-id="Unit-readmeContent"> <div class="Overview-readmeContent js-readmeContent"><h3 class="h1" id="readme-erpc">eRPC</h3> <p><a href="https://github.com/andeya/erpc/releases" rel="nofollow"><img src="https://img.shields.io/github/tag/andeya/erpc.svg" alt="tag"/></a> <img src="https://img.shields.io/badge/Go-%3E%3D%201.18-%23007d9c" alt="Go Version"/> <a href="https://pkg.go.dev/github.com/andeya/erpc/v7" rel="nofollow"><img src="https://godoc.org/github.com/andeya/erpc?status.svg" alt="GoDoc"/></a> <img src="https://github.com/andeya/erpc/actions/workflows/go-ci.yml/badge.svg" alt="Build Status"/> <a href="https://goreportcard.com/report/github.com/andeya/erpc/v7" rel="nofollow"><img src="https://goreportcard.com/badge/github.com/andeya/erpc/v7" alt="Go report"/></a> <a href="https://github.com/andeya/erpc/blob/v7.2.2/LICENSE" rel="nofollow"><img src="https://img.shields.io/github/license/andeya/erpc" alt="License"/></a></p> <p>eRPC is an efficient, extensible and easy-to-use RPC framework.</p> <p>Suitable for RPC, Microservice, Peer-to-Peer, IM, Game and other fields.</p> <p><a href="https://github.com/andeya/erpc/tree/master/README_ZH.md" rel="nofollow">简体中文</a></p> <p><img src="https://github.com/andeya/erpc/raw/master/doc/erpc_module_diagram.png" alt="eRPC-Framework"/></p> <h4 class="h2" id="readme-install">Install</h4> <ul> <li> <p>go vesion ≥ 1.18</p> </li> <li> <p>install</p> </li> </ul> <pre><code>GO111MODULE=on go get -u -v -insecure github.com/andeya/erpc/v7 </code></pre> <ul> <li>import</li> </ul> <pre><code>import "github.com/andeya/erpc/v7" </code></pre> <h4 class="h2" id="readme-feature">Feature</h4> <ul> <li>Use peer to provide the same API package for the server and client</li> <li>Provide multi-layout abstractions such as: <ul> <li>peer</li> <li>session/socket</li> <li>router</li> <li>handle/context</li> <li>message</li> <li>protocol</li> <li>codec</li> <li>transfer filter</li> <li>plugin</li> </ul> </li> <li>Support reboot and shutdown gracefully</li> <li>HTTP-compatible message format: <ul> <li>Composed of two parts, the <code>Header</code> and the <code>Body</code></li> <li><code>Header</code> contains metadata in the same format as HTTP header</li> <li><code>Body</code> supports for custom codec of Content Type-Like, already implemented: <ul> <li>Protobuf</li> <li>Thrift</li> <li>JSON</li> <li>XML</li> <li>Form</li> <li>Plain</li> </ul> </li> <li>Support push, call-reply and more message types</li> </ul> </li> <li>Support custom message protocol, and provide some common implementations: <ul> <li><code>rawproto</code> - Default high performance binary protocol</li> <li><code>jsonproto</code> - JSON message protocol</li> <li><code>pbproto</code> - Ptotobuf message protocol</li> <li><code>thriftproto</code> - Thrift message protocol</li> <li><code>httproto</code> - HTTP message protocol</li> </ul> </li> <li>Optimized high performance transport layer <ul> <li>Use Non-block socket and I/O multiplexing technology</li> <li>Support setting the size of socket I/O buffer</li> <li>Support setting the size of the reading message (if exceed disconnect it)</li> <li>Support controling the connection file descriptor</li> </ul> </li> <li>Support a variety of network types: <ul> <li><code>tcp</code></li> <li><code>tcp4</code></li> <li><code>tcp6</code></li> <li><code>unix</code></li> <li><code>unixpacket</code></li> <li><code>kcp</code></li> <li><code>quic</code></li> <li>other <ul> <li>websocket</li> <li>evio</li> </ul> </li> </ul> </li> <li>Provide a rich plug-in point, and already implemented: <ul> <li>auth</li> <li>binder</li> <li>heartbeat</li> <li>ignorecase(service method)</li> <li>overloader</li> <li>proxy(for unknown service method)</li> <li>secure</li> </ul> </li> <li>Powerful and flexible logging system: <ul> <li>Detailed log information, support print input and output details</li> <li>Support setting slow operation alarm threshold</li> <li>Support for custom implementation log component</li> </ul> </li> <li>Client session support automatically redials after disconnection</li> </ul> <h4 class="h2" id="readme-benchmark">Benchmark</h4> <p><strong>Self Test</strong></p> <ul> <li> <p>A server and a client process, running on the same machine</p> </li> <li> <p>CPU: Intel Xeon E312xx (Sandy Bridge) 16 cores 2.53GHz</p> </li> <li> <p>Memory: 16G</p> </li> <li> <p>OS: Linux 2.6.32-696.16.1.el6.centos.plus.x86_64, CentOS 6.4</p> </li> <li> <p>Go: 1.9.2</p> </li> <li> <p>Message size: 581 bytes</p> </li> <li> <p>Message codec: protobuf</p> </li> <li> <p>Sent total 1000000 messages</p> </li> <li> <p>erpc</p> </li> </ul> <table> <thead> <tr> <th>client concurrency</th> <th>mean(ms)</th> <th>median(ms)</th> <th>max(ms)</th> <th>min(ms)</th> <th>throughput(TPS)</th> </tr> </thead> <tbody> <tr> <td>100</td> <td>1</td> <td>0</td> <td>16</td> <td>0</td> <td>75505</td> </tr> <tr> <td>500</td> <td>9</td> <td>11</td> <td>97</td> <td>0</td> <td>52192</td> </tr> <tr> <td>1000</td> <td>19</td> <td>24</td> <td>187</td> <td>0</td> <td>50040</td> </tr> <tr> <td>2000</td> <td>39</td> <td>54</td> <td>409</td> <td>0</td> <td>42551</td> </tr> <tr> <td>5000</td> <td>96</td> <td>128</td> <td>1148</td> <td>0</td> <td>46367</td> </tr> </tbody> </table> <ul> <li>erpc/socket</li> </ul> <table> <thead> <tr> <th>client concurrency</th> <th>mean(ms)</th> <th>median(ms)</th> <th>max(ms)</th> <th>min(ms)</th> <th>throughput(TPS)</th> </tr> </thead> <tbody> <tr> <td>100</td> <td>0</td> <td>0</td> <td>14</td> <td>0</td> <td>225682</td> </tr> <tr> <td>500</td> <td>2</td> <td>1</td> <td>24</td> <td>0</td> <td>212630</td> </tr> <tr> <td>1000</td> <td>4</td> <td>3</td> <td>51</td> <td>0</td> <td>180733</td> </tr> <tr> <td>2000</td> <td>8</td> <td>6</td> <td>64</td> <td>0</td> <td>183351</td> </tr> <tr> <td>5000</td> <td>21</td> <td>18</td> <td>651</td> <td>0</td> <td>133886</td> </tr> </tbody> </table> <p><strong>Comparison Test</strong></p> <table> <tbody><tr><th>Environment</th><th>Throughputs</th><th>Mean Latency</th><th>P99 Latency</th></tr> <tr> <td width="10%"><img src="https://github.com/andeya/rpc-benchmark/raw/master/result/env.png"/></td> <td width="30%"><img src="https://github.com/andeya/rpc-benchmark/raw/master/result/throughput.png"/></td> <td width="30%"><img src="https://github.com/andeya/rpc-benchmark/raw/master/result/mean_latency.png"/></td> <td width="30%"><img src="https://github.com/andeya/rpc-benchmark/raw/master/result/p99_latency.png"/></td> </tr> </tbody></table> <p><strong><a href="https://github.com/andeya/rpc-benchmark" rel="nofollow">More Detail</a></strong></p> <ul> <li>Profile torch of erpc/socket</li> </ul> <p><img src="https://github.com/andeya/erpc/raw/master/doc/erpc_socket_profile_torch.png" alt="erpc_socket_profile_torch"/></p> <p><strong><a href="https://github.com/andeya/erpc/raw/master/doc/erpc_socket_profile_torch.svg" rel="nofollow">svg file</a></strong></p> <ul> <li>Heap torch of erpc/socket</li> </ul> <p><img src="https://github.com/andeya/erpc/raw/master/doc/erpc_socket_heap_torch.png" alt="erpc_socket_heap_torch"/></p> <p><strong><a href="https://github.com/andeya/erpc/raw/master/doc/erpc_socket_heap_torch.svg" rel="nofollow">svg file</a></strong></p> <h4 class="h2" id="readme-example">Example</h4> <h5 class="h3" id="readme-server-go">server.go</h5> <pre><code>package main import ( "fmt" "time" "github.com/andeya/erpc/v7" ) func main() { defer erpc.FlushLogger() // graceful go erpc.GraceSignal() // server peer srv := erpc.NewPeer(erpc.PeerConfig{ CountTime: true, ListenPort: 9090, PrintDetail: true, }) // srv.SetTLSConfig(erpc.GenerateTLSConfigForServer()) // router srv.RouteCall(new(Math)) // broadcast per 5s go func() { for { time.Sleep(time.Second * 5) srv.RangeSession(func(sess erpc.Session) bool { sess.Push( "/push/status", fmt.Sprintf("this is a broadcast, server time: %v", time.Now()), ) return true }) } }() // listen and serve srv.ListenAndServe() } // Math handler type Math struct { erpc.CallCtx } // Add handles addition request func (m *Math) Add(arg *[]int) (int, *erpc.Status) { // test meta erpc.Infof("author: %s", m.PeekMeta("author")) // add var r int for _, a := range *arg { r += a } // response return r, nil } </code></pre> <h5 class="h3" id="readme-client-go">client.go</h5> <pre><code>package main import ( "time" "github.com/andeya/erpc/v7" ) func main() { defer erpc.SetLoggerLevel("ERROR")() cli := erpc.NewPeer(erpc.PeerConfig{}) defer cli.Close() // cli.SetTLSConfig(&tls.Config{InsecureSkipVerify: true}) cli.RoutePush(new(Push)) sess, stat := cli.Dial(":9090") if !stat.OK() { erpc.Fatalf("%v", stat) } var result int stat = sess.Call("/math/add", []int{1, 2, 3, 4, 5}, &result, erpc.WithAddMeta("author", "andeya"), ).Status() if !stat.OK() { erpc.Fatalf("%v", stat) } erpc.Printf("result: %d", result) erpc.Printf("Wait 10 seconds to receive the push...") time.Sleep(time.Second * 10) } // Push push handler type Push struct { erpc.PushCtx } // Push handles '/push/status' message func (p *Push) Status(arg *string) *erpc.Status { erpc.Printf("%s", *arg) return nil } </code></pre> <p><a href="https://github.com/andeya/erpc/tree/master/examples" rel="nofollow">More Examples</a></p> <h4 class="h2" id="readme-usage">Usage</h4> <p><strong>NOTE:</strong></p> <ul> <li>It is best to set the packet size when reading: <code>SetReadLimit</code></li> <li>The default packet size limit when reading is 1 GB</li> </ul> <h5 class="h3" id="readme-peer-server-or-client-demo">Peer(server or client) Demo</h5> <pre><code>// Start a server var peer1 = erpc.NewPeer(erpc.PeerConfig{ ListenPort: 9090, // for server role }) peer1.Listen() ... // Start a client var peer2 = erpc.NewPeer(erpc.PeerConfig{}) var sess, err = peer2.Dial("127.0.0.1:8080") </code></pre> <h5 class="h3" id="readme-call-struct-api-template">Call-Struct API template</h5> <pre><code>type Aaa struct { erpc.CallCtx } func (x *Aaa) XxZz(arg *<T>) (<T>, *erpc.Status) { ... return r, nil } </code></pre> <ul> <li>register it to root router:</li> </ul> <pre><code>// register the call route // HTTP mapping: /aaa/xx_zz // RPC mapping: Aaa.XxZz peer.RouteCall(new(Aaa)) // or register the call route // HTTP mapping: /xx_zz // RPC mapping: XxZz peer.RouteCallFunc((*Aaa).XxZz) </code></pre> <h5 class="h3" id="readme-service-method-mapping">Service method mapping</h5> <ul> <li> <p>The default mapping(HTTPServiceMethodMapper) of struct(func) name to service methods:</p> <ul> <li><code>AaBb</code> -> <code>/aa_bb</code></li> <li><code>ABcXYz</code> -> <code>/abc_xyz</code></li> <li><code>Aa__Bb</code> -> <code>/aa_bb</code></li> <li><code>aa__bb</code> -> <code>/aa_bb</code></li> <li><code>ABC__XYZ</code> -> <code>/abc_xyz</code></li> <li><code>Aa_Bb</code> -> <code>/aa/bb</code></li> <li><code>aa_bb</code> -> <code>/aa/bb</code></li> <li><code>ABC_XYZ</code> -> <code>/abc/xyz</code></li> </ul> <pre><code>erpc.SetServiceMethodMapper(erpc.HTTPServiceMethodMapper) </code></pre> </li> <li> <p>The mapping(RPCServiceMethodMapper) of struct(func) name to service methods:</p> <ul> <li><code>AaBb</code> -> <code>AaBb</code></li> <li><code>ABcXYz</code> -> <code>ABcXYz</code></li> <li><code>Aa__Bb</code> -> <code>Aa_Bb</code></li> <li><code>aa__bb</code> -> <code>aa_bb</code></li> <li><code>ABC__XYZ</code> -> <code>ABC_XYZ</code></li> <li><code>Aa_Bb</code> -> <code>Aa.Bb</code></li> <li><code>aa_bb</code> -> <code>aa.bb</code></li> <li><code>ABC_XYZ</code> -> <code>ABC.XYZ</code></li> </ul> <pre><code>erpc.SetServiceMethodMapper(erpc.RPCServiceMethodMapper) </code></pre> </li> </ul> <h5 class="h3" id="readme-call-function-api-template">Call-Function API template</h5> <pre><code>func XxZz(ctx erpc.CallCtx, arg *<T>) (<T>, *erpc.Status) { ... return r, nil } </code></pre> <ul> <li>register it to root router:</li> </ul> <pre><code>// register the call route // HTTP mapping: /xx_zz // RPC mapping: XxZz peer.RouteCallFunc(XxZz) </code></pre> <h5 class="h3" id="readme-push-struct-api-template">Push-Struct API template</h5> <pre><code>type Bbb struct { erpc.PushCtx } func (b *Bbb) YyZz(arg *<T>) *erpc.Status { ... return nil } </code></pre> <ul> <li>register it to root router:</li> </ul> <pre><code>// register the push handler // HTTP mapping: /bbb/yy_zz // RPC mapping: Bbb.YyZz peer.RoutePush(new(Bbb)) // or register the push handler // HTTP mapping: /yy_zz // RPC mapping: YyZz peer.RoutePushFunc((*Bbb).YyZz) </code></pre> <h5 class="h3" id="readme-push-function-api-template">Push-Function API template</h5> <pre><code>// YyZz register the handler func YyZz(ctx erpc.PushCtx, arg *<T>) *erpc.Status { ... return nil } </code></pre> <ul> <li>register it to root router:</li> </ul> <pre><code>// register the push handler // HTTP mapping: /yy_zz // RPC mapping: YyZz peer.RoutePushFunc(YyZz) </code></pre> <h5 class="h3" id="readme-unknown-call-function-api-template">Unknown-Call-Function API template</h5> <pre><code>func XxxUnknownCall (ctx erpc.UnknownCallCtx) (interface{}, *erpc.Status) { ... return r, nil } </code></pre> <ul> <li>register it to root router:</li> </ul> <pre><code>// register the unknown call route: /* peer.SetUnknownCall(XxxUnknownCall) </code></pre> <h5 class="h3" id="readme-unknown-push-function-api-template">Unknown-Push-Function API template</h5> <pre><code>func XxxUnknownPush(ctx erpc.UnknownPushCtx) *erpc.Status { ... return nil } </code></pre> <ul> <li>register it to root router:</li> </ul> <pre><code>// register the unknown push route: /* peer.SetUnknownPush(XxxUnknownPush) </code></pre> <h5 class="h3" id="readme-plugin-demo">Plugin Demo</h5> <pre><code>// NewIgnoreCase Returns a ignoreCase plugin. func NewIgnoreCase() *ignoreCase { return &ignoreCase{} } type ignoreCase struct{} var ( _ erpc.PostReadCallHeaderPlugin = new(ignoreCase) _ erpc.PostReadPushHeaderPlugin = new(ignoreCase) ) func (i *ignoreCase) Name() string { return "ignoreCase" } func (i *ignoreCase) PostReadCallHeader(ctx erpc.ReadCtx) *erpc.Status { // Dynamic transformation path is lowercase ctx.UriObject().Path = strings.ToLower(ctx.UriObject().Path) return nil } func (i *ignoreCase) PostReadPushHeader(ctx erpc.ReadCtx) *erpc.Status { // Dynamic transformation path is lowercase ctx.UriObject().Path = strings.ToLower(ctx.UriObject().Path) return nil } </code></pre> <h5 class="h3" id="readme-register-above-handler-and-plugin">Register above handler and plugin</h5> <pre><code>// add router group group := peer.SubRoute("test") // register to test group group.RouteCall(new(Aaa), NewIgnoreCase()) peer.RouteCallFunc(XxZz, NewIgnoreCase()) group.RoutePush(new(Bbb)) peer.RoutePushFunc(YyZz) peer.SetUnknownCall(XxxUnknownCall) peer.SetUnknownPush(XxxUnknownPush) </code></pre> <h5 class="h3" id="readme-config">Config</h5> <pre><code>type PeerConfig struct { Network string `yaml:"network" ini:"network" comment:"Network; tcp, tcp4, tcp6, unix, unixpacket, kcp or quic"` LocalIP string `yaml:"local_ip" ini:"local_ip" comment:"Local IP"` ListenPort uint16 `yaml:"listen_port" ini:"listen_port" comment:"Listen port; for server role"` DialTimeout time.Duration `yaml:"dial_timeout" ini:"dial_timeout" comment:"Default maximum duration for dialing; for client role; ns,µs,ms,s,m,h"` RedialTimes int32 `yaml:"redial_times" ini:"redial_times" comment:"The maximum times of attempts to redial, after the connection has been unexpectedly broken; Unlimited when <0; for client role"` RedialInterval time.Duration `yaml:"redial_interval" ini:"redial_interval" comment:"Interval of redialing each time, default 100ms; for client role; ns,µs,ms,s,m,h"` DefaultBodyCodec string `yaml:"default_body_codec" ini:"default_body_codec" comment:"Default body codec type id"` DefaultSessionAge time.Duration `yaml:"default_session_age" ini:"default_session_age" comment:"Default session max age, if less than or equal to 0, no time limit; ns,µs,ms,s,m,h"` DefaultContextAge time.Duration `yaml:"default_context_age" ini:"default_context_age" comment:"Default CALL or PUSH context max age, if less than or equal to 0, no time limit; ns,µs,ms,s,m,h"` SlowCometDuration time.Duration `yaml:"slow_comet_duration" ini:"slow_comet_duration" comment:"Slow operation alarm threshold; ns,µs,ms,s ..."` PrintDetail bool `yaml:"print_detail" ini:"print_detail" comment:"Is print body and metadata or not"` CountTime bool `yaml:"count_time" ini:"count_time" comment:"Is count cost time or not"` } </code></pre> <h5 class="h3" id="readme-optimize">Optimize</h5> <ul> <li> <p>SetMessageSizeLimit sets max message size. If maxSize<=0, set it to max uint32.</p> <pre><code>func SetMessageSizeLimit(maxMessageSize uint32) </code></pre> </li> <li> <p>SetSocketKeepAlive sets whether the operating system should send keepalive messages on the connection.</p> <pre><code>func SetSocketKeepAlive(keepalive bool) </code></pre> </li> <li> <p>SetSocketKeepAlivePeriod sets period between keep alives.</p> <pre><code>func SetSocketKeepAlivePeriod(d time.Duration) </code></pre> </li> <li> <p>SetSocketNoDelay controls whether the operating system should delay message transmission in hopes of sending fewer messages (Nagle's algorithm). The default is true (no delay), meaning that data is sent as soon as possible after a Write.</p> <pre><code>func SetSocketNoDelay(_noDelay bool) </code></pre> </li> <li> <p>SetSocketReadBuffer sets the size of the operating system's receive buffer associated with the connection.</p> <pre><code>func SetSocketReadBuffer(bytes int) </code></pre> </li> <li> <p>SetSocketWriteBuffer sets the size of the operating system's transmit buffer associated with the connection.</p> <pre><code>func SetSocketWriteBuffer(bytes int) </code></pre> </li> </ul> <h4 class="h2" id="readme-extensions">Extensions</h4> <h5 class="h3" id="readme-codec">Codec</h5> <table> <thead> <tr> <th>package</th> <th>import</th> <th>description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/andeya/erpc/raw/master/codec/json_codec.go" rel="nofollow">json</a></td> <td><code>"github.com/andeya/erpc/v7/codec"</code></td> <td>JSON codec(erpc own)</td> </tr> <tr> <td><a href="https://github.com/andeya/erpc/raw/master/codec/protobuf_codec.go" rel="nofollow">protobuf</a></td> <td><code>"github.com/andeya/erpc/v7/codec"</code></td> <td>Protobuf codec(erpc own)</td> </tr> <tr> <td><a href="https://github.com/andeya/erpc/raw/master/codec/thrift_codec.go" rel="nofollow">thrift</a></td> <td><code>"github.com/andeya/erpc/v7/codec"</code></td> <td>Form(url encode) codec(erpc own)</td> </tr> <tr> <td><a href="https://github.com/andeya/erpc/raw/master/codec/xml_codec.go" rel="nofollow">xml</a></td> <td><code>"github.com/andeya/erpc/v7/codec"</code></td> <td>Form(url encode) codec(erpc own)</td> </tr> <tr> <td><a href="https://github.com/andeya/erpc/raw/master/codec/plain_codec.go" rel="nofollow">plain</a></td> <td><code>"github.com/andeya/erpc/v7/codec"</code></td> <td>Plain text codec(erpc own)</td> </tr> <tr> <td><a href="https://github.com/andeya/erpc/raw/master/codec/form_codec.go" rel="nofollow">form</a></td> <td><code>"github.com/andeya/erpc/v7/codec"</code></td> <td>Form(url encode) codec(erpc own)</td> </tr> </tbody> </table> <h5 class="h3" id="readme-plugin">Plugin</h5> <table> <thead> <tr> <th>package</th> <th>import</th> <th>description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/andeya/erpc/tree/master/plugin/auth" rel="nofollow">auth</a></td> <td><code>"github.com/andeya/erpc/v7/plugin/auth"</code></td> <td>An auth plugin for verifying peer at the first time</td> </tr> <tr> <td><a href="https://github.com/andeya/erpc/tree/master/plugin/binder" rel="nofollow">binder</a></td> <td><code>"github.com/andeya/erpc/v7/plugin/binder"</code></td> <td>Parameter Binding Verification for Struct Handler</td> </tr> <tr> <td><a href="https://github.com/andeya/erpc/tree/master/plugin/heartbeat" rel="nofollow">heartbeat</a></td> <td><code>"github.com/andeya/erpc/v7/plugin/heartbeat"</code></td> <td>A generic timing heartbeat plugin</td> </tr> <tr> <td><a href="https://github.com/andeya/erpc/tree/master/plugin/proxy" rel="nofollow">proxy</a></td> <td><code>"github.com/andeya/erpc/v7/plugin/proxy"</code></td> <td>A proxy plugin for handling unknown calling or pushing</td> </tr> <tr> <td><a href="https://github.com/andeya/erpc/tree/master/plugin/secure" rel="nofollow">secure</a></td> <td><code>"github.com/andeya/erpc/v7/plugin/secure"</code></td> <td>Encrypting/decrypting the message body</td> </tr> <tr> <td><a href="https://github.com/andeya/erpc/tree/master/plugin/overloader" rel="nofollow">overloader</a></td> <td><code>"github.com/andeya/erpc/v7/plugin/overloader"</code></td> <td>A plugin to protect erpc from overload</td> </tr> </tbody> </table> <h5 class="h3" id="readme-protocol">Protocol</h5> <table> <thead> <tr> <th>package</th> <th>import</th> <th>description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/andeya/erpc/tree/master/proto/rawproto" rel="nofollow">rawproto</a></td> <td><code>"github.com/andeya/erpc/v7/proto/rawproto</code></td> <td>A fast socket communication protocol(erpc default protocol)</td> </tr> <tr> <td><a href="https://github.com/andeya/erpc/tree/master/proto/jsonproto" rel="nofollow">jsonproto</a></td> <td><code>"github.com/andeya/erpc/v7/proto/jsonproto"</code></td> <td>A JSON socket communication protocol</td> </tr> <tr> <td><a href="https://github.com/andeya/erpc/tree/master/proto/pbproto" rel="nofollow">pbproto</a></td> <td><code>"github.com/andeya/erpc/v7/proto/pbproto"</code></td> <td>A Protobuf socket communication protocol</td> </tr> <tr> <td><a href="https://github.com/andeya/erpc/tree/master/proto/thriftproto" rel="nofollow">thriftproto</a></td> <td><code>"github.com/andeya/erpc/v7/proto/thriftproto"</code></td> <td>A Thrift communication protocol</td> </tr> <tr> <td><a href="https://github.com/andeya/erpc/tree/master/proto/httproto" rel="nofollow">httproto</a></td> <td><code>"github.com/andeya/erpc/v7/proto/httproto"</code></td> <td>A HTTP style socket communication protocol</td> </tr> </tbody> </table> <h5 class="h3" id="readme-transfer-filter">Transfer-Filter</h5> <table> <thead> <tr> <th>package</th> <th>import</th> <th>description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/andeya/erpc/tree/master/xfer/gzip" rel="nofollow">gzip</a></td> <td><code>"github.com/andeya/erpc/v7/xfer/gzip"</code></td> <td>Gzip(erpc own)</td> </tr> <tr> <td><a href="https://github.com/andeya/erpc/tree/master/xfer/md5" rel="nofollow">md5</a></td> <td><code>"github.com/andeya/erpc/v7/xfer/md5"</code></td> <td>Provides a integrity check transfer filter</td> </tr> </tbody> </table> <h5 class="h3" id="readme-mixer">Mixer</h5> <table> <thead> <tr> <th>package</th> <th>import</th> <th>description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/andeya/erpc/tree/master/mixer/multiclient" rel="nofollow">multiclient</a></td> <td><code>"github.com/andeya/erpc/v7/mixer/multiclient"</code></td> <td>Higher throughput client connection pool when transferring large messages (such as downloading files)</td> </tr> <tr> <td><a href="https://github.com/andeya/erpc/tree/master/mixer/websocket" rel="nofollow">websocket</a></td> <td><code>"github.com/andeya/erpc/v7/mixer/websocket"</code></td> <td>Makes the eRPC framework compatible with websocket protocol as specified in RFC 6455</td> </tr> <tr> <td><a href="https://github.com/andeya/erpc/tree/master/mixer/evio" rel="nofollow">evio</a></td> <td><code>"github.com/andeya/erpc/v7/mixer/evio"</code></td> <td>A fast event-loop networking framework that uses the erpc API layer</td> </tr> <tr> <td><a href="https://github.com/xiaoenai/tp-micro/tree/master/helper/mod-html" rel="nofollow">html</a></td> <td><code>html "github.com/xiaoenai/tp-micro/helper/mod-html"</code></td> <td>HTML render for http client</td> </tr> </tbody> </table> <h4 class="h2" id="readme-projects-based-on-erpc">Projects based on eRPC</h4> <table> <thead> <tr> <th>project</th> <th>description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/xiaoenai/tp-micro" rel="nofollow">TP-Micro</a></td> <td>TP-Micro is a simple, powerful micro service framework based on eRPC</td> </tr> <tr> <td><a href="https://github.com/andeya/pholcus" rel="nofollow">Pholcus</a></td> <td>Pholcus is a distributed, high concurrency and powerful web crawler software</td> </tr> </tbody> </table> <h4 class="h2" id="readme-business-users">Business Users</h4> <p><a href="http://www.xiaoenai.com" rel="nofollow"><img src="https://raw.githubusercontent.com/andeya/imgs-repo/master/xiaoenai.png" height="50" alt="深圳市梦之舵信息技术有限公司"/></a> <a href="https://tech.pingan.com/index.html" rel="nofollow"><img src="http://pa-tech.hirede.com/templates/pa-tech/Images/logo.png" height="50" alt="平安科技"/></a> <br/> <a href="http://www.fun.tv" rel="nofollow"><img src="http://static.funshion.com/open/static/img/logo.gif" height="70" alt="北京风行在线技术有限公司"/></a> <a href="http://www.kejishidai.cn" rel="nofollow"><img src="http://simg.ktvms.com/picture/logo.png" height="70" alt="北京可即时代网络公司"/></a> <a href="https://www.kuaishou.com/" rel="nofollow"><img src="https://inews.gtimg.com/newsapp_bt/0/4400789257/1000" height="70" alt="快手短视频平台"/></a></p> <h4 class="h2" id="readme-license">License</h4> <p>eRPC is under Apache v2 License. See the <a href="https://github.com/andeya/erpc/raw/master/LICENSE" rel="nofollow">LICENSE</a> file for the full license text</p> </div> </div> <button class="UnitReadme-expandLink js-readmeExpand" data-test-id="readme-expand" data-gtmc="readme button" aria-label="Expand Readme">Expand ▾</button> <button class="UnitReadme-collapseLink js-readmeCollapse" data-test-id="readme-collapse" data-gtmc="readme button" aria-label="Expand Readme">Collapse ▴</button> </div> <div class="UnitDirectories js-unitDirectories"> <h2 class="UnitDirectories-title" id="section-directories"> <img class="go-Icon" height="24" width="24" src="/static/shared/icon/folder_gm_grey_24dp.svg" alt=""> Directories <a class="UnitDirectories-idLink" href="#section-directories" title="Go to Directories" aria-label="Go to Directories">¶</a> </h2> <div class="UnitDirectories-toggles"> <div class="UnitDirectories-toggleButtons"> <button class="js-showInternalDirectories" data-test-id="internal-directories-toggle" data-gtmc="directories button" aria-label="Show Internal Directories"> Show internal </button> <button class="js-expandAllDirectories" data-test-id="directories-toggle" data-gtmc="directories button" aria-label="Expand All Directories"> Expand all </button> </div> </div> <table class="UnitDirectories-table UnitDirectories-table--tree js-expandableTable" data-test-id="UnitDirectories-table"> <tr class="UnitDirectories-tableHeader UnitDirectories-tableHeader--tree"> <th>Path</th> <th class="UnitDirectories-desktopSynopsis">Synopsis</th> </tr> <tr class=""> <td data-id="codec" data-aria-owns=""> <div class="UnitDirectories-pathCell"> <div><a href="/github.com/andeya/erpc/v7@v7.2.2/codec">codec</a> </div> <div class="UnitDirectories-mobileSynopsis">Package codec is the body's codec set.</div> </div> </td> <td class="UnitDirectories-desktopSynopsis">Package codec is the body's codec set.</td></tr></tr> <tr data-aria-controls="examples-bench/msg examples-plugin-tps " class=""> <td data-id="examples" data-aria-owns="examples-bench/msg examples-plugin-tps "> <div class="UnitDirectories-pathCell"> <div><button type="button" class="go-Button go-Button--inline UnitDirectories-toggleButton" aria-expanded="false" aria-label="2 more from" data-aria-controls="examples-bench/msg examples-plugin-tps " data-aria-labelledby="examples-button examples" data-id="examples-button"> <img class="go-Icon" height="24" width="24" src="/static/shared/icon/arrow_right_gm_grey_24dp.svg" alt=""> </button><span>examples</span> </td> <td class="UnitDirectories-desktopSynopsis"></td></tr><tr data-id="examples-bench/msg" class=""> <td> <div class="UnitDirectories-subdirectory"> <span> <a href="/github.com/andeya/erpc/v7@v7.2.2/examples/bench/msg">bench/msg</a> </span> <div class="UnitDirectories-mobileSynopsis">Package msg is a generated protocol buffer package.</div> </div> </td> <td class="UnitDirectories-desktopSynopsis">Package msg is a generated protocol buffer package.</td><tr data-id="examples-plugin-tps" class=""> <td> <div class="UnitDirectories-subdirectory"> <span> <a href="/github.com/andeya/erpc/v7@v7.2.2/examples/plugin-tps">plugin-tps</a> </span> <div class="UnitDirectories-mobileSynopsis"></div> </div> </td> <td class="UnitDirectories-desktopSynopsis"></td></tr> <tr class=""> <td data-id="kcp" data-aria-owns=""> <div class="UnitDirectories-pathCell"> <div><a href="/github.com/andeya/erpc/v7@v7.2.2/kcp">kcp</a> </div> <div class="UnitDirectories-mobileSynopsis"></div> </div> </td> <td class="UnitDirectories-desktopSynopsis"></td></tr></tr> <tr data-aria-controls="mixer-evio mixer-multiclient mixer-websocket mixer-websocket/jsonSubProto mixer-websocket/pbSubProto mixer-websocket/pbSubProto/pb mixer-websocket/websocket " class=""> <td data-id="mixer" data-aria-owns="mixer-evio mixer-multiclient mixer-websocket mixer-websocket/jsonSubProto mixer-websocket/pbSubProto mixer-websocket/pbSubProto/pb mixer-websocket/websocket "> <div class="UnitDirectories-pathCell"> <div><button type="button" class="go-Button go-Button--inline UnitDirectories-toggleButton" aria-expanded="false" aria-label="7 more from" data-aria-controls="mixer-evio mixer-multiclient mixer-websocket mixer-websocket/jsonSubProto mixer-websocket/pbSubProto mixer-websocket/pbSubProto/pb mixer-websocket/websocket " data-aria-labelledby="mixer-button mixer" data-id="mixer-button"> <img class="go-Icon" height="24" width="24" src="/static/shared/icon/arrow_right_gm_grey_24dp.svg" alt=""> </button><span>mixer</span> </td> <td class="UnitDirectories-desktopSynopsis"></td></tr><tr data-id="mixer-evio" class=""> <td> <div class="UnitDirectories-subdirectory"> <span> <a href="/github.com/andeya/erpc/v7@v7.2.2/mixer/evio">evio</a> </span> <div class="UnitDirectories-mobileSynopsis"></div> </div> </td> <td class="UnitDirectories-desktopSynopsis"></td><tr data-id="mixer-multiclient" class=""> <td> <div class="UnitDirectories-subdirectory"> <span> <a href="/github.com/andeya/erpc/v7@v7.2.2/mixer/multiclient">multiclient</a> </span> <div class="UnitDirectories-mobileSynopsis">Package multiclient is a higher throughput client connection pool when transferring large messages (such as downloading files).</div> </div> </td> <td class="UnitDirectories-desktopSynopsis">Package multiclient is a higher throughput client connection pool when transferring large messages (such as downloading files).</td><tr data-id="mixer-websocket" class=""> <td> <div class="UnitDirectories-subdirectory"> <span> <a href="/github.com/andeya/erpc/v7@v7.2.2/mixer/websocket">websocket</a> </span> <div class="UnitDirectories-mobileSynopsis">Package websocket is an extension package that makes the eRPC framework compatible with websocket protocol as specified in RFC 6455.</div> </div> </td> <td class="UnitDirectories-desktopSynopsis">Package websocket is an extension package that makes the eRPC framework compatible with websocket protocol as specified in RFC 6455.</td><tr data-id="mixer-websocket/jsonSubProto" class=""> <td> <div class="UnitDirectories-subdirectory"> <span> <a href="/github.com/andeya/erpc/v7@v7.2.2/mixer/websocket/jsonSubProto">websocket/jsonSubProto</a> </span> <div class="UnitDirectories-mobileSynopsis">Package jsonSubProto is implemented JSON socket communication protocol.</div> </div> </td> <td class="UnitDirectories-desktopSynopsis">Package jsonSubProto is implemented JSON socket communication protocol.</td><tr data-id="mixer-websocket/pbSubProto" class=""> <td> <div class="UnitDirectories-subdirectory"> <span> <a href="/github.com/andeya/erpc/v7@v7.2.2/mixer/websocket/pbSubProto">websocket/pbSubProto</a> </span> <div class="UnitDirectories-mobileSynopsis">Package pbSubProto is implemented PROTOBUF socket communication protocol.</div> </div> </td> <td class="UnitDirectories-desktopSynopsis">Package pbSubProto is implemented PROTOBUF socket communication protocol.</td><tr data-id="mixer-websocket/pbSubProto/pb" class=""> <td> <div class="UnitDirectories-subdirectory"> <span> <a href="/github.com/andeya/erpc/v7@v7.2.2/mixer/websocket/pbSubProto/pb">websocket/pbSubProto/pb</a> </span> <div class="UnitDirectories-mobileSynopsis"></div> </div> </td> <td class="UnitDirectories-desktopSynopsis"></td><tr data-id="mixer-websocket/websocket" class=""> <td> <div class="UnitDirectories-subdirectory"> <span> <a href="/github.com/andeya/erpc/v7@v7.2.2/mixer/websocket/websocket">websocket/websocket</a> </span> <div class="UnitDirectories-mobileSynopsis">Package websocket implements a client and server for the WebSocket protocol as specified in RFC 6455.</div> </div> </td> <td class="UnitDirectories-desktopSynopsis">Package websocket implements a client and server for the WebSocket protocol as specified in RFC 6455.</td></tr> <tr data-aria-controls="plugin-auth plugin-binder plugin-heartbeat plugin-ignorecase plugin-overloader plugin-proxy plugin-secure " class=""> <td data-id="plugin" data-aria-owns="plugin-auth plugin-binder plugin-heartbeat plugin-ignorecase plugin-overloader plugin-proxy plugin-secure "> <div class="UnitDirectories-pathCell"> <div><button type="button" class="go-Button go-Button--inline UnitDirectories-toggleButton" aria-expanded="false" aria-label="7 more from" data-aria-controls="plugin-auth plugin-binder plugin-heartbeat plugin-ignorecase plugin-overloader plugin-proxy plugin-secure " data-aria-labelledby="plugin-button plugin" data-id="plugin-button"> <img class="go-Icon" height="24" width="24" src="/static/shared/icon/arrow_right_gm_grey_24dp.svg" alt=""> </button><span>plugin</span> </td> <td class="UnitDirectories-desktopSynopsis"></td></tr><tr data-id="plugin-auth" class=""> <td> <div class="UnitDirectories-subdirectory"> <span> <a href="/github.com/andeya/erpc/v7@v7.2.2/plugin/auth">auth</a> </span> <div class="UnitDirectories-mobileSynopsis">Package auth is a plugin for verifying peer at the first time.</div> </div> </td> <td class="UnitDirectories-desktopSynopsis">Package auth is a plugin for verifying peer at the first time.</td><tr data-id="plugin-binder" class=""> <td> <div class="UnitDirectories-subdirectory"> <span> <a href="/github.com/andeya/erpc/v7@v7.2.2/plugin/binder">binder</a> </span> <div class="UnitDirectories-mobileSynopsis">Package binder is Parameter Binding Verification Plugin for Struct Handler.</div> </div> </td> <td class="UnitDirectories-desktopSynopsis">Package binder is Parameter Binding Verification Plugin for Struct Handler.</td><tr data-id="plugin-heartbeat" class=""> <td> <div class="UnitDirectories-subdirectory"> <span> <a href="/github.com/andeya/erpc/v7@v7.2.2/plugin/heartbeat">heartbeat</a> </span> <div class="UnitDirectories-mobileSynopsis">Heartbeat is a generic timing heartbeat plugin.</div> </div> </td> <td class="UnitDirectories-desktopSynopsis">Heartbeat is a generic timing heartbeat plugin.</td><tr data-id="plugin-ignorecase" class=""> <td> <div class="UnitDirectories-subdirectory"> <span> <a href="/github.com/andeya/erpc/v7@v7.2.2/plugin/ignorecase">ignorecase</a> </span> <div class="UnitDirectories-mobileSynopsis">Package ignorecase dynamically ignoring the case of path</div> </div> </td> <td class="UnitDirectories-desktopSynopsis">Package ignorecase dynamically ignoring the case of path</td><tr data-id="plugin-overloader" class=""> <td> <div class="UnitDirectories-subdirectory"> <span> <a href="/github.com/andeya/erpc/v7@v7.2.2/plugin/overloader">overloader</a> </span> <div class="UnitDirectories-mobileSynopsis">Package overloader is a plugin to protect erpc from overload.</div> </div> </td> <td class="UnitDirectories-desktopSynopsis">Package overloader is a plugin to protect erpc from overload.</td><tr data-id="plugin-proxy" class=""> <td> <div class="UnitDirectories-subdirectory"> <span> <a href="/github.com/andeya/erpc/v7@v7.2.2/plugin/proxy">proxy</a> </span> <div class="UnitDirectories-mobileSynopsis"></div> </div> </td> <td class="UnitDirectories-desktopSynopsis"></td><tr data-id="plugin-secure" class=""> <td> <div class="UnitDirectories-subdirectory"> <span> <a href="/github.com/andeya/erpc/v7@v7.2.2/plugin/secure">secure</a> </span> <div class="UnitDirectories-mobileSynopsis">Package secure encrypting/decrypting the message body.</div> </div> </td> <td class="UnitDirectories-desktopSynopsis">Package secure encrypting/decrypting the message body.</td></tr> <tr data-aria-controls="proto-httproto proto-jsonproto proto-pbproto proto-pbproto/pb proto-rawproto proto-thriftproto proto-thriftproto/gen-go/thriftproto_test " class=""> <td data-id="proto" data-aria-owns="proto-httproto proto-jsonproto proto-pbproto proto-pbproto/pb proto-rawproto proto-thriftproto proto-thriftproto/gen-go/thriftproto_test "> <div class="UnitDirectories-pathCell"> <div><button type="button" class="go-Button go-Button--inline UnitDirectories-toggleButton" aria-expanded="false" aria-label="7 more from" data-aria-controls="proto-httproto proto-jsonproto proto-pbproto proto-pbproto/pb proto-rawproto proto-thriftproto proto-thriftproto/gen-go/thriftproto_test " data-aria-labelledby="proto-button proto" data-id="proto-button"> <img class="go-Icon" height="24" width="24" src="/static/shared/icon/arrow_right_gm_grey_24dp.svg" alt=""> </button><span>proto</span> </td> <td class="UnitDirectories-desktopSynopsis"></td></tr><tr data-id="proto-httproto" class=""> <td> <div class="UnitDirectories-subdirectory"> <span> <a href="/github.com/andeya/erpc/v7@v7.2.2/proto/httproto">httproto</a> </span> <div class="UnitDirectories-mobileSynopsis">Package httproto is implemented HTTP style socket communication protocol.</div> </div> </td> <td class="UnitDirectories-desktopSynopsis">Package httproto is implemented HTTP style socket communication protocol.</td><tr data-id="proto-jsonproto" class=""> <td> <div class="UnitDirectories-subdirectory"> <span> <a href="/github.com/andeya/erpc/v7@v7.2.2/proto/jsonproto">jsonproto</a> </span> <div class="UnitDirectories-mobileSynopsis">Package jsonproto is implemented JSON socket communication protocol.</div> </div> </td> <td class="UnitDirectories-desktopSynopsis">Package jsonproto is implemented JSON socket communication protocol.</td><tr data-id="proto-pbproto" class=""> <td> <div class="UnitDirectories-subdirectory"> <span> <a href="/github.com/andeya/erpc/v7@v7.2.2/proto/pbproto">pbproto</a> </span> <div class="UnitDirectories-mobileSynopsis">Package pbproto is implemented PROTOBUF socket communication protocol.</div> </div> </td> <td class="UnitDirectories-desktopSynopsis">Package pbproto is implemented PROTOBUF socket communication protocol.</td><tr data-id="proto-pbproto/pb" class=""> <td> <div class="UnitDirectories-subdirectory"> <span> <a href="/github.com/andeya/erpc/v7@v7.2.2/proto/pbproto/pb">pbproto/pb</a> </span> <div class="UnitDirectories-mobileSynopsis"></div> </div> </td> <td class="UnitDirectories-desktopSynopsis"></td><tr data-id="proto-rawproto" class=""> <td> <div class="UnitDirectories-subdirectory"> <span> <a href="/github.com/andeya/erpc/v7@v7.2.2/proto/rawproto">rawproto</a> </span> <div class="UnitDirectories-mobileSynopsis"></div> </div> </td> <td class="UnitDirectories-desktopSynopsis"></td><tr data-id="proto-thriftproto" class=""> <td> <div class="UnitDirectories-subdirectory"> <span> <a href="/github.com/andeya/erpc/v7@v7.2.2/proto/thriftproto">thriftproto</a> </span> <div class="UnitDirectories-mobileSynopsis"></div> </div> </td> <td class="UnitDirectories-desktopSynopsis"></td><tr data-id="proto-thriftproto/gen-go/thriftproto_test" class=""> <td> <div class="UnitDirectories-subdirectory"> <span> <a href="/github.com/andeya/erpc/v7@v7.2.2/proto/thriftproto/gen-go/thriftproto_test">thriftproto/gen-go/thriftproto_test</a> </span> <div class="UnitDirectories-mobileSynopsis"></div> </div> </td> <td class="UnitDirectories-desktopSynopsis"></td></tr> <tr class=""> <td data-id="quic" data-aria-owns=""> <div class="UnitDirectories-pathCell"> <div><a href="/github.com/andeya/erpc/v7@v7.2.2/quic">quic</a> </div> <div class="UnitDirectories-mobileSynopsis"></div> </div> </td> <td class="UnitDirectories-desktopSynopsis"></td></tr></tr> <tr data-aria-controls="socket-example/pb " class=""> <td data-id="socket" data-aria-owns="socket-example/pb "> <div class="UnitDirectories-pathCell"> <div><button type="button" class="go-Button go-Button--inline UnitDirectories-toggleButton" aria-expanded="false" aria-label="1 more from" data-aria-controls="socket-example/pb " data-aria-labelledby="socket-button socket" data-id="socket-button"> <img class="go-Icon" height="24" width="24" src="/static/shared/icon/arrow_right_gm_grey_24dp.svg" alt=""> </button><a href="/github.com/andeya/erpc/v7@v7.2.2/socket">socket</a> </div> <div class="UnitDirectories-mobileSynopsis">Package socket provides a concise, powerful and high-performance TCP.</div> </div> </td> <td class="UnitDirectories-desktopSynopsis">Package socket provides a concise, powerful and high-performance TCP.</td></tr><tr data-id="socket-example/pb" class=""> <td> <div class="UnitDirectories-subdirectory"> <span> <a href="/github.com/andeya/erpc/v7@v7.2.2/socket/example/pb">example/pb</a> </span> <div class="UnitDirectories-mobileSynopsis"></div> </div> </td> <td class="UnitDirectories-desktopSynopsis"></td></tr> <tr data-aria-controls="utils-color " class=""> <td data-id="utils" data-aria-owns="utils-color "> <div class="UnitDirectories-pathCell"> <div><button type="button" class="go-Button go-Button--inline UnitDirectories-toggleButton" aria-expanded="false" aria-label="1 more from" data-aria-controls="utils-color " data-aria-labelledby="utils-button utils" data-id="utils-button"> <img class="go-Icon" height="24" width="24" src="/static/shared/icon/arrow_right_gm_grey_24dp.svg" alt=""> </button><a href="/github.com/andeya/erpc/v7@v7.2.2/utils">utils</a> </div> <div class="UnitDirectories-mobileSynopsis"></div> </div> </td> <td class="UnitDirectories-desktopSynopsis"></td></tr><tr data-id="utils-color" class=""> <td> <div class="UnitDirectories-subdirectory"> <span> <a href="/github.com/andeya/erpc/v7@v7.2.2/utils/color">color</a> </span> <div class="UnitDirectories-mobileSynopsis"></div> </div> </td> <td class="UnitDirectories-desktopSynopsis"></td></tr> <tr data-aria-controls="xfer-gzip xfer-md5 " class=""> <td data-id="xfer" data-aria-owns="xfer-gzip xfer-md5 "> <div class="UnitDirectories-pathCell"> <div><button type="button" class="go-Button go-Button--inline UnitDirectories-toggleButton" aria-expanded="false" aria-label="2 more from" data-aria-controls="xfer-gzip xfer-md5 " data-aria-labelledby="xfer-button xfer" data-id="xfer-button"> <img class="go-Icon" height="24" width="24" src="/static/shared/icon/arrow_right_gm_grey_24dp.svg" alt=""> </button><a href="/github.com/andeya/erpc/v7@v7.2.2/xfer">xfer</a> </div> <div class="UnitDirectories-mobileSynopsis">Package xfer is transfer filter set.</div> </div> </td> <td class="UnitDirectories-desktopSynopsis">Package xfer is transfer filter set.</td></tr><tr data-id="xfer-gzip" class=""> <td> <div class="UnitDirectories-subdirectory"> <span> <a href="/github.com/andeya/erpc/v7@v7.2.2/xfer/gzip">gzip</a> </span> <div class="UnitDirectories-mobileSynopsis"></div> </div> </td> <td class="UnitDirectories-desktopSynopsis"></td><tr data-id="xfer-md5" class=""> <td> <div class="UnitDirectories-subdirectory"> <span> <a href="/github.com/andeya/erpc/v7@v7.2.2/xfer/md5">md5</a> </span> <div class="UnitDirectories-mobileSynopsis">Package md5 provides a integrity check transfer filter</div> </div> </td> <td class="UnitDirectories-desktopSynopsis">Package md5 provides a integrity check transfer filter</td></tr> </table> </div> </div> </div> <div id="showInternal-description" hidden> Click to show internal directories. </div> <div id="hideInternal-description" hidden> Click to hide internal directories. </div> </article> <footer class="go-Main-footer"></footer> </main> <footer class="go-Footer"> <div class="go-Footer-links"> <div class="go-Footer-linkColumn"> <a href="https://go.dev/solutions" class="go-Footer-link go-Footer-link--primary" data-gtmc="footer link"> Why Go </a> <a href="https://go.dev/solutions#use-cases" class="go-Footer-link" data-gtmc="footer link"> Use Cases </a> <a href="https://go.dev/solutions#case-studies" class="go-Footer-link" data-gtmc="footer link"> Case Studies </a> </div> <div class="go-Footer-linkColumn"> <a href="https://learn.go.dev/" class="go-Footer-link go-Footer-link--primary" data-gtmc="footer link"> Get Started </a> <a href="https://play.golang.org" class="go-Footer-link" data-gtmc="footer link"> Playground </a> <a href="https://tour.golang.org" class="go-Footer-link" data-gtmc="footer link"> Tour </a> <a href="https://stackoverflow.com/questions/tagged/go?tab=Newest" class="go-Footer-link" data-gtmc="footer link"> Stack Overflow </a> <a href="https://go.dev/help" class="go-Footer-link" data-gtmc="footer link"> Help </a> </div> <div class="go-Footer-linkColumn"> <a href="https://pkg.go.dev" class="go-Footer-link go-Footer-link--primary" data-gtmc="footer link"> Packages </a> <a href="/std" class="go-Footer-link" data-gtmc="footer link"> Standard Library </a> <a href="/golang.org/x" class="go-Footer-link" data-gtmc="footer link"> Sub-repositories </a> <a href="https://pkg.go.dev/about" class="go-Footer-link" data-gtmc="footer link"> About Go Packages </a> </div> <div class="go-Footer-linkColumn"> <a href="https://go.dev/project" class="go-Footer-link go-Footer-link--primary" data-gtmc="footer link"> About </a> <a href="https://go.dev/dl/" class="go-Footer-link" data-gtmc="footer link">Download</a> <a href="https://go.dev/blog" class="go-Footer-link" data-gtmc="footer link">Blog</a> <a href="https://github.com/golang/go/issues" class="go-Footer-link" data-gtmc="footer link"> Issue Tracker </a> <a href="https://go.dev/doc/devel/release.html" class="go-Footer-link" data-gtmc="footer link"> Release Notes </a> <a href="https://blog.golang.org/go-brand" class="go-Footer-link" data-gtmc="footer link"> Brand Guidelines </a> <a href="https://go.dev/conduct" class="go-Footer-link" data-gtmc="footer link"> Code of Conduct </a> </div> <div class="go-Footer-linkColumn"> <a href="https://www.twitter.com/golang" class="go-Footer-link go-Footer-link--primary" data-gtmc="footer link"> Connect </a> <a href="https://www.twitter.com/golang" class="go-Footer-link" data-gtmc="footer link"> Twitter </a> <a href="https://github.com/golang" class="go-Footer-link" data-gtmc="footer link">GitHub</a> <a href="https://invite.slack.golangbridge.org/" class="go-Footer-link" data-gtmc="footer link"> Slack </a> <a href="https://reddit.com/r/golang" class="go-Footer-link" data-gtmc="footer link"> r/golang </a> <a href="https://www.meetup.com/pro/go" class="go-Footer-link" data-gtmc="footer link"> Meetup </a> <a href="https://golangweekly.com/" class="go-Footer-link" data-gtmc="footer link"> Golang Weekly </a> </div> </div> <div class="go-Footer-bottom"> <img class="go-Footer-gopher" width="1431" height="901" src="/static/shared/gopher/pilot-bust-1431x901.svg" alt="Gopher in flight goggles"> <ul class="go-Footer-listRow"> <li class="go-Footer-listItem"> <a href="https://go.dev/copyright" data-gtmc="footer link">Copyright</a> </li> <li class="go-Footer-listItem"> <a href="https://go.dev/tos" data-gtmc="footer link">Terms of Service</a> </li> <li class="go-Footer-listItem"> <a href="http://www.google.com/intl/en/policies/privacy/" data-gtmc="footer link" target="_blank" rel="noopener"> Privacy Policy </a> </li> <li class="go-Footer-listItem"> <a href="https://go.dev/s/pkgsite-feedback" target="_blank" rel="noopener" data-gtmc="footer link"> Report an Issue </a> </li> <li class="go-Footer-listItem"> <button class="go-Button go-Button--text go-Footer-toggleTheme js-toggleTheme" aria-label="Theme Toggle"> <img data-value="auto" class="go-Icon go-Icon--inverted" height="24" width="24" src="/static/shared/icon/brightness_6_gm_grey_24dp.svg" alt="System theme"> <img data-value="dark" class="go-Icon go-Icon--inverted" height="24" width="24" src="/static/shared/icon/brightness_2_gm_grey_24dp.svg" alt="Dark theme"> <img data-value="light" class="go-Icon go-Icon--inverted" height="24" width="24" src="/static/shared/icon/light_mode_gm_grey_24dp.svg" alt="Light theme"> <p> Theme Toggle </p> </button> </li> <li class="go-Footer-listItem"> <button class="go-Button go-Button--text go-Footer-keyboard js-openShortcuts" aria-label="Shorcuts Modal"> <img class="go-Icon go-Icon--inverted" height="24" width="24" src="/static/shared/icon/keyboard_grey_24dp.svg" alt=""> <p> Shortcuts Modal </p> </button> </li> </ul> <a class="go-Footer-googleLogo" href="https://google.com" target="_blank"rel="noopener" data-gtmc="footer link"> <img class="go-Footer-googleLogoImg" height="24" width="72" src="/static/shared/logo/google-white.svg" alt="Google logo"> </a> </div> </footer> <dialog id="jump-to-modal" class="JumpDialog go-Modal go-Modal--md js-modal"> <form method="dialog" data-gmtc="jump to form" aria-label="Jump to Identifier"> <div class="Dialog-title go-Modal-header"> <h2>Jump to</h2> <button class="go-Button go-Button--inline" type="button" data-modal-close data-gtmc="modal button" aria-label="Close" > <img class="go-Icon" height="24" width="24" src="/static/shared/icon/close_gm_grey_24dp.svg" alt="" /> </button> </div> <div class="JumpDialog-filter"> <input class="JumpDialog-input go-Input" autocomplete="off" type="text"> </div> <div class="JumpDialog-body go-Modal-body"> <div class="JumpDialog-list"></div> </div> <div class="go-Modal-actions"> <button class="go-Button" data-test-id="close-dialog">Close</button> </div> </form> </dialog> <dialog class="ShortcutsDialog go-Modal go-Modal--sm js-modal"> <form method="dialog"> <div class="go-Modal-header"> <h2>Keyboard shortcuts</h2> <button class="go-Button go-Button--inline" type="button" data-modal-close data-gtmc="modal button" aria-label="Close" > <img class="go-Icon" height="24" width="24" src="/static/shared/icon/close_gm_grey_24dp.svg" alt="" /> </button> </div> <div class="go-Modal-body"> <table> <tbody> <tr><td class="ShortcutsDialog-key"> <strong>?</strong></td><td> : This menu</td> </tr> <tr><td class="ShortcutsDialog-key"> <strong>/</strong></td><td> : Search site</td> </tr> <tr><td class="ShortcutsDialog-key"> <strong>f</strong> or <strong>F</strong></td><td> : Jump to</td> </tr> <tr> <td class="ShortcutsDialog-key"><strong>y</strong> or <strong>Y</strong></td> <td> : Canonical URL</td> </tr> </tbody> </table> </div> <div class="go-Modal-actions"> <button class="go-Button" data-test-id="close-dialog">Close</button> </div> </form> </dialog> <section class="Cookie-notice js-cookieNotice"> <div>go.dev uses cookies from Google to deliver and enhance the quality of its services and to analyze traffic. <a target=_blank href="https://policies.google.com/technologies/cookies">Learn more.</a></div> <div><button class="go-Button">Okay</button></div> </section> <script> // this will throw if the querySelector can’t find the element const gtmId = document.querySelector('.js-gtmID').dataset.gtmid; if (!gtmId) { throw new Error('Google Tag Manager ID not found'); } loadScript(`https://www.googletagmanager.com/gtm.js?id=${gtmId}`); </script> <noscript> <iframe src="https://www.googletagmanager.com/ns.html?id=GTM-W8MVQXG" height="0" width="0" style="display:none;visibility:hidden"> </iframe> </noscript> <div class="js-canonicalURLPath" data-canonical-url-path="/github.com/andeya/erpc/v7@v7.2.2" hidden></div> <div class="js-playgroundVars" data-modulepath="github.com/andeya/erpc/v7" data-version="v7.2.2" hidden></div> <script> loadScript('/static/frontend/unit/main/main.js') </script> <script> loadScript('/static/frontend/unit/unit.js') </script> </body> </html>