跳至主要内容

博文

目前显示的是标签为“UDP”的博文

golang udp socket

package main import ( f "fmt" "net" ) func main() { addr, err := net.ResolveUDPAddr("udp", ":4822") if err != nil { f.Println(err) return } c, err := net.ListenUDP("udp", addr) if err != nil { f.Println(err) return } defer c.Close() raddr, _ := net.ResolveUDPAddr("udp", "127.0.0.1:4821") c.WriteToUDP([]byte("high ! from shareMe"), raddr) b := make([]byte, 20) n, ra, err := c.ReadFromUDP(b) if err != nil { f.Println(err) return } f.Println("get msg:", ra.String(), string(b[:n])) }

UDP穿越NAT原理

http://blog.csdn.net/ldd909/article/details/5979967 论坛上经常有对P2P原理的讨论,但是讨论归讨论,很少有实质的东西产生(源代码)。在这里我就用自己实现的一个源代码来说明UDP穿越NAT的原理。 首先先介绍一些基本概念:      NAT(Network Address Translators),网络地址转换:网络地址转换是在IP地址日益缺乏的情况下产生的,它的主要目的就是为了能够地址重用。NAT分为两大类,基本的NAT和NAPT(Network Address/Port Translator)。      最开始NAT是运行在路由器上的一个功能模块。      最先提出的是基本的NAT,它的产生基于如下事实:一个私有网络(域)中的节点中只有很少的节点需要与外网连接(呵呵,这是在上世纪90年代中期提出的)。那么这个子网中其实只有少数的节点需要全球唯一的IP地址,其他的节点的IP地址应该是可以重用的。      因此,基本的NAT实现的功能很简单,在子网内使用一个保留的IP子网段,这些IP对外是不可见的。子网内只有少数一些IP地址可以对应到真正全球唯一的IP地址。如果这些节点需要访问外部网络,那么基本NAT就负责将这个节点的子网内IP转化为一个全球唯一的IP然后发送出去。(基本的NAT会改变IP包中的原IP地址,但是不会改变IP包中的端口)      关于基本的NAT可以参看RFC 1631      另外一种NAT叫做NAPT,从名称上我们也可以看得出,NAPT不但会改变经过这个NAT设备的IP数据报的IP地址,还会改变IP数据报的TCP/UDP端口。基本NAT的设备可能我们见的不多(呵呵,我没有见到过),NAPT才是我们真正讨论的主角。看下图:      有一个私有网络10.*.*.*,Client A是其中的一台计算机,这个网络的网关(一个NAT设备)的外网IP是155.99.25.11(应该还有一个内网的IP地址,比如10.0.0.1...

Java UDP 广播与多播

摘要: 简单实现了一下基于UDP的广播和多播的功能,主要是理解多播和广播的概念。 1、广播: DatagramSocket.recieve ( DatagramPacket dp ) ; DatagramSocket.send ( DatagramPacket dp ) ; 同一网段所有主机都能接收,前提是端口要监听 客户端发送广播,开启端口监听的服务端接收并打印消息 服务端程序: import  java.io.IOException; import  java.net.DatagramPacket; import  java.net.DatagramSocket; import  java.net.SocketException; public   class  TestServer { public   static   void  main(String[] args) { int  port =  9999 ; //开启监听的端口 DatagramSocket ds =  null ; DatagramPacket dp =  null ; byte [] buf =  new   byte [ 1024 ]; //存储发来的消息 StringBuffer sbuf =  new  StringBuffer(); try  { //绑定端口的 ds =  new  DatagramSocket(port); dp =  new  DatagramPacket(buf, buf.length); System.out. println ( "监听广播端口打开:" ); ds.setSoTimeout(10000); ds.receive(dp); ds.close(); int ...