STUN client初试

从前从前很偶然地实现了p2p

完成了 从丹东到北京 的一次难忘的'对话'

我真的感谢 感谢在甚至不知道hole punching之前 能有这么一次运气

让我领略了Internet 带给我的兴奋

 

然后,注定地, 幸运之后 得到了一个不能重现的失望结果.(我的一位同学,你可要长命百岁啊,你是那个历史除了我唯一见证!)

 

不过,毕竟有成功的先例,让我学习一些网络知识有了很多动力.

首先,网络上铺天盖地的 nat类型的解释 真的很容易混淆概念..(而且一些是与标准概念冲突的)

标准的 那些 '对称' 等的类型定义 ,到现在为止 ,我都把RFC2026 的解释当作 我看过的 最清澈 理解参考.

(nat类型的解释 可以参看 我的摘录: http://blog.csdn.net/ga6840/archive/2011/02/10/6177612.aspx)

 

然后,寻寻觅觅,发现自己始终不忍心 去租用服务器.所以这段时间开始实现STUN协议的客户端.

 

昨天晚上兴奋地得到了stun.iol.unh.edu 返回的Binding Request.. 

 

对于STUN协议,我要感谢:

http://beta.codeproject.com/KB/IP/stunner.aspx          上面关于客户端的实现 提供的参考. 

还有

http://basiccoder.com/c-program-to-test-stun.html/comment-page-1#comment-2007

提供的对 初试STUN的很有启发的 helloworld验证程序

 

特别的,感谢 http://kevinxiao.blog.163.com/blog/static/3120379201062652540120/

提醒我们注意不是所有 STUN 服务端 都是 "诚实的", 我一开始就是 用stun.xten.com 这个DN (指向 75.101.138.128)

他不返回结果还好, 返回结果让我很高兴 ,但是却是错误的...

改使用了上述连接 博文 使用的132.177.123.13 (stun.iol.unh.edu) 才返回了正确的值

 

 

 

还有很多路要走

明天继续.

 

 

 

以下配一个截图,仅作纪念:

(收到数据我才猛然注意到 原来 rfc3489 定义的 Binding Response 对应的两个ASCII 原来都是 0x01 ,

加起来就是如图所示的两个笑脸!

不知道 标准的制定者 是有意无意 ....)

 

STUN

 

By ga6840

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
你可以使用 Rust 编程语言来实现一个 STUN 客户端。STUN(Simple Traversal of UDP through NATs)是一种用于网络地址转换(NAT)穿透的协议。 下面是一个简单的示例代码,演示了如何使用 Rust 和 tokio 库来实现一个基本的 STUN 客户端: ```rust use std::net::{SocketAddr, UdpSocket}; use tokio::runtime::Runtime; fn main() { // 设置 STUN 服务器的地址 let stun_server: SocketAddr = "stun.example.com:3478".parse().unwrap(); // 创建 UDP 套接字 let socket = UdpSocket::bind("0.0.0.0:0").expect("Failed to bind socket"); // 发送 STUN 请求 let mut buf = [0u8; 1024]; let request: [u8; 20] = [ 0x00, 0x01, 0x00, 0x00, 0x21, 0x12, 0xA4, 0x42, // STUN 请求头部 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // STUN 请求数据 0x00, 0x08, 0x00, 0x14, // STUN 请求数据长度 ]; socket .send_to(&request, stun_server) .expect("Failed to send STUN request"); // 接收 STUN 响应 let (recv_len, _) = socket.recv_from(&mut buf).expect("Failed to receive STUN response"); let response = &buf[..recv_len]; // 处理 STUN 响应 // 这里可以根据 STUN 协议解析 response 数据 println!("STUN response: {:?}", response); } ``` 这只是一个简单的示例,实际上你可能需要更多的代码来处理 STUN 协议的各种情况和错误处理。你可以使用其他 Rust 库来帮助解析和处理 STUN 响应数据。 请注意,这个示例使用了 tokio 库来实现异步网络编程。你需要在 `Cargo.toml` 文件中添加相应的依赖,例如: ```toml [dependencies] tokio = { version = "1", features = ["full"] } ``` 希望这个示例能对你有所帮助!如果你有任何其他问题,请随时提问。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值