【问题标题】:AutoBind DatagramSocket like TCP Socket in javaAutoBind DatagramSocket 类似于 java 中的 TCP Socket
【发布时间】:2014-12-04 19:36:25
【问题描述】:

java中的TCP socket可以用来连接服务器,无需手动绑定。

final Socket socket = SocketChannel.open().socket();
socket.connect(StaticData.vmAddress);
//can send receive data

但是当使用 DataGramSocket 时,似乎没有自动绑定功能。 我试过这个:

DatagramSocket socketTest1 = DatagramChannel.open().socket();
socketTest1.connect(InetAddress.getByName(stunServer), stunServerPort);
socketTest1.setSoTimeout(timeout);
byte[] data = sendMH.getBytes();
DatagramPacket send = new DatagramPacket(data, data.length);
socketTest1.send(send); //got error at this point

堆栈跟踪:

java.net.BindException: bind failed: EINVAL (Invalid argument)
W/System.err﹕ at libcore.io.IoBridge.bind(IoBridge.java:89)
W/System.err﹕ at java.net.PlainDatagramSocketImpl.bind(PlainDatagramSocketImpl.java:68)
W/System.err﹕ at java.net.DatagramSocket.ensureBound(DatagramSocket.java:422)
W/System.err﹕ at java.net.DatagramSocket.send(DatagramSocket.java:263)
W/System.err﹕ at java.nio.DatagramChannelImpl$DatagramSocketAdapter.send(DatagramChannelImpl.java:559)
W/System.err﹕ at reach.project.stun.test.DiscoveryTest.test1(DiscoveryTest.java:103) //(socketTest1.send(send) line)

如果我也可以依赖 DatagramSocket 中的自动绑定,那将非常有帮助。有没有办法做到这一点?

【问题讨论】:

    标签: java sockets networking tcp datagram


    【解决方案1】:

    要将 DatagramSocket 自动绑定到系统分配的端口,请使用 new DatagramSocket(0) 创建它。

    【讨论】:

    • 我最终只做了这个。我的理解是,0 和 0.0.0.0 应该代表通配符地址。
    • @Dexter 0.0.0.0 是通配符 IP 地址,表示通过所有接口监听/接收。端口号为零告诉系统分配一个特定的端口。它不是任何类型的通配符。
    猜你喜欢
    • 2020-10-31
    • 1970-01-01
    • 2015-05-24
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    相关资源
    最近更新 更多