{"id":19448533,"url":"https://github.com/vnt-dev/p2p_channel","last_synced_at":"2025-09-13T00:36:29.915Z","repository":{"id":249340485,"uuid":"607120146","full_name":"vnt-dev/p2p_channel","owner":"vnt-dev","description":"NAT traversal","archived":false,"fork":false,"pushed_at":"2024-08-07T06:00:35.000Z","size":73,"stargazers_count":4,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-05-17T20:16:33.877Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vnt-dev.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,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-02-27T11:02:05.000Z","updated_at":"2024-08-26T08:15:26.000Z","dependencies_parsed_at":"2024-11-10T16:29:42.490Z","dependency_job_id":"133b060f-afc7-4e70-ae67-39b201d36590","html_url":"https://github.com/vnt-dev/p2p_channel","commit_stats":null,"previous_names":["vnt-dev/p2p_channel"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/vnt-dev/p2p_channel","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vnt-dev%2Fp2p_channel","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vnt-dev%2Fp2p_channel/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vnt-dev%2Fp2p_channel/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vnt-dev%2Fp2p_channel/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vnt-dev","download_url":"https://codeload.github.com/vnt-dev/p2p_channel/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vnt-dev%2Fp2p_channel/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259571640,"owners_count":22878182,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":[],"created_at":"2024-11-10T16:27:23.507Z","updated_at":"2025-06-13T03:03:14.717Z","avatar_url":"https://github.com/vnt-dev.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# p2p_channel\nNAT traversal\n\n一个点对点通信工具库\n\n对于对称网络，会启动一组UDP尝试打洞\n## 示例\n\n```rust\n\nfn main() {\n    // 参数一：对称网络类型时，指定用于打洞的端口数量，根据需要设置，较大的相对打洞速度越快，太大会导致网络压力从而引发丢包和限流\n    // 参数二：路由表记录的路由读超时时间\n    // 参数三：路由表记录的路由写超时时间\n    let (mut channel, mut punch, idle) = p2p_channel::boot::Boot::new::\u003cString\u003e(100, 9000, 0).unwrap();\n\n    // 设置本地网络类型，设置正确类型增加打洞成功概率\n    //channel.set_nat_type(NatType::Cone).unwrap();\n\n    {\n        // 空闲处理，添加的路由空闲时触发\n        std::thread::spawn(move || {\n            loop {\n                let (idle_status, id, route) = idle.next_idle().unwrap();\n                // channel.send_to_route()\n                // channel.remove_route(\u0026id)\n                println!(\"{:?}\", idle_status);\n            }\n        });\n    }\n    {\n        // 打洞处理\n        // 对方是锥形网络的打洞\n        std::thread::spawn(move || {\n            let buf = b\"hello\";\n            loop {\n\t\t// 取出打洞的请求\n                let (id, nat_info) = punch.next_cone(None).unwrap();\n\t\t// 尝试对nat_info记录的远端打洞\n                punch.punch(buf, id, nat_info).unwrap(); \n            }\n        });\n\t// 对方是对称型网络打洞\n        std::thread::spawn(move || {\n            let buf = b\"hello\";\n            loop {\n                let (id, nat_info) = punch.next_symmetric(None).unwrap();\n                punch.punch(buf, id, nat_info).unwrap();\n            }\n        });\n    }\n    // 与中继服务器沟通对端信息\n    //channel.send_to_addr(b\"hello\", \"remote_server_ip\".parse();\n    // 读取中继服务器的消息\n    //channel.recv_from(\u0026mut buf, None).unwrap();\n\n   // 触发打洞\n   /* channel\n         .punch(\n\t      \"peer_id\".to_string(),  //为对端设定的ID\n\t       vec![public_ip],       //对端公网IP\n\t       public_port,           //对端公网端口\n\t       0,                     //公共端口区间\n\t       local_ip,              //对端本地IP\n\t       local_port,            //对端本地端口\n\t       NatType::Symmetric,    //对端的Nat网络类型\n\t ); */\n    // 接收数据处理\n    loop {\n        let mut buf = [0; 10240];\n\t// 接受远端发过来的消息\n        let (len, route_key) = channel.recv_from(\u0026mut buf, None).unwrap();\n        // Do something...\n\t// 如果是对端发送过来的信息，那么加入路由，后续可以通过ID发送消息给对端\n        // channel.add_route(\"peer_id\".to_string(),Route::from(route_key, 10, 64)) //加入路由，超时触发空闲\n    }\n}\n\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvnt-dev%2Fp2p_channel","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvnt-dev%2Fp2p_channel","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvnt-dev%2Fp2p_channel/lists"}