我有这样的代码:
InetAddress bind = InetAddress.getByName("192.168.0.1")
MulticastSocket socket = new MulticastSocket(new InetSocketAddress(bind,0));
socket.setInterface(bind);在windows 7和使用JDK6u17的windows上,我在非套接字上得到了一个SocketException: socket操作。
但如果我将第2行改为:
MulticastSocket socket = new MulticastSocket(0);没关系,也可以在jdk6u14中找到。
为什么?谢谢。
编辑:为什么端口0应该是问题?
MulticastSocket socket = new MulticastSocket(0);这个code.But一切都很好
MulticastSocket socket = new MulticastSocket(new InetSocketAddress(bind,port));不管港口是什么。
发布于 2010-08-21 02:53:57
当您绑定到特定的接口时,将setInterface()调用到同一个接口是多余的。把它移开。只有在绑定到INADDR_ANY时,或者在Java中绑定为null (或未指定为参数)的InetAddress时,才需要使用它。
为了解决其他一些答案中的错误,以及它们的含义:
还有一个问题: 192.168.0.1是本地计算机上NIC的IP地址吗?它必须是。
发布于 2009-12-30 01:32:42
根据文档,您应该使用端口号实例化它(因此0将是有效的)。
发布于 2009-12-30 02:08:08
我不太确定。构造函数MulticastSocket(SocketAddress bindaddr)用于什么?为什么它可以在jdk6u14上正常工作,而不是jdk6u17呢?以及为什么在windows 2003服务器上可以使用jdk6u17呢?
关于RHEL5.2 5.2 jdk1.4+
lst1.htm伯克利描述:有人尝试对不是套接字的东西进行操作。指定的套接字参数引用的是文件,而不是套接字。
WinSock描述:和伯克利一样。套接字输入参数不是有效的套接字句柄(要么它从未有效,要么是文件句柄(不是套接字句柄),或者如果它是套接字句柄,它已经关闭)。
详细说明:
如果fd_set中的任何套接字都是无效的套接字句柄,则select():WSAENOTSOCK失败。
开发人员建议:您是否无意中关闭了应用程序某个部分的套接字,而没有通知另一部分?在应用程序中使用套接字状态,并/或将此错误优雅地处理为非致命错误。
当MulticastSocket创建时,socket.isClosed()==true
https://stackoverflow.com/questions/1977949
复制相似问题