标签: multicastsocket

使用Ehcache多播获取"无法分配请求的地址"java.net.SocketException

获取java.net.SocketException试图启动一个多播提供程序时:

2013-09-11 11:45:44,204 [main] ERROR net.sf.ehcache.distribution.MulticastRMICacheManagerPeerProvider: Error starting heartbeat. Error was: Can't assign requested address
java.net.SocketException: Can't assign requested address
at java.net.PlainDatagramSocketImpl.join(Native Method)
at java.net.AbstractPlainDatagramSocketImpl.join(AbstractPlainDatagramSocketImpl.java:178)
at java.net.MulticastSocket.joinGroup(MulticastSocket.java:319)
at net.sf.ehcache.distribution.MulticastKeepaliveHeartbeatReceiver.init(MulticastKeepaliveHeartbeatReceiver.java:88)
at net.sf.ehcache.distribution.MulticastRMICacheManagerPeerProvider.init(MulticastRMICacheManagerPeerProvider.java:95)
Run Code Online (Sandbox Code Playgroud)

java multicast ehcache ipv6 multicastsocket

37
推荐指数
3
解决办法
3万
查看次数

组播数据包:发送和接收问题

在我改编一些多播教程时,我改变了发送数据包的方法.

在我的例子中,我创建了一个大小的数据包队列bytes[1024],然后通过Socket.Send()所有在线网络适配器发送它

问题:

发送时,另一个被调用的receiveMessage()方法正在一个单独的线程上运行.使用Socket.Bind(),它捕获数据包,但只捕获1个数据包.

我是否进行了太多处理,从而延迟(并丢失)收到的数据包?

UPDATE

我正在考虑为传入的数据包添加队列,因此1个线程捕获并存储,第二个处理数据包.

SendMethod

Socket _listener_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

foreach (IPAddress localIP in Dns.GetHostAddresses(Dns.GetHostName()).Where(i => i.AddressFamily == AddressFamily.InterNetwork))
{
    //handle image and files                
    _listener_socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(_MultiIP, localIP));
    _listener_socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 1);
    _listener_socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
    _listener_socket.MulticastLoopback = true;
    _listener_socket.Connect(new IPEndPoint(_MultiIP, _PORT));

    int count = MSGS_TO_SEND.Count;

    while (count > 0)
    {
        count--;
        byte[] temp = (byte[])(MSGS_TO_SEND.Dequeue());
        _listener_socket.Send(temp, _BYTE_BUFFER_SIZE, SocketFlags.None);
        MSGS_TO_SEND.Enqueue(temp);
    }              

    //----------------------------------------------
    //-------------------SEND DATA------------------
    //----------------------------------------------
}

_listener_socket.Close();
Run Code Online (Sandbox Code Playgroud)

接收方法 …

c# multicastsocket

8
推荐指数
1
解决办法
409
查看次数

Java-Android上的MulticastSocket问题

我开始使用MulticastSocket进行编码,尝试使用客户端和服务器创建一个简单的应用程序来发送消息.

我对服务器的代码:

    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.InetAddress;
    import java.net.MulticastSocket;
    import java.net.SocketException;


    public class Servidor {
 private static MulticastSocket ms;
 public static void main(String[] args) throws IOException{

  InetAddress sessAddr = InetAddress.getByName("224.2.76.24");
     try{
    sessAddr = InetAddress.getByName("224.2.76.24");
       ms = new MulticastSocket(5500);
       ms.joinGroup(sessAddr);

       while (true)
       {
       byte[] mensaje = new byte[1024];
       mensaje = "aa".getBytes();
       DatagramPacket dp = new DatagramPacket(mensaje, mensaje.length,sessAddr,5500);
       ms.send(dp);
       }
      }
      catch (SocketException se) {
        System.err.println(se);
      }

      ms.leaveGroup(sessAddr);

    }

}
Run Code Online (Sandbox Code Playgroud)

这在客户端:

    package com.example;
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.InetAddress;
    import java.net.MulticastSocket; …
Run Code Online (Sandbox Code Playgroud)

java android multicastsocket

7
推荐指数
1
解决办法
2万
查看次数

MulticastSocket构造函数和绑定到端口或SocketAddress

我可能对绑定这个术语有一个基本的误解,但我对MulticastSocket及其构造函数的使用感到困惑.他们不会做理解他们应该做的事应该这样做,任何能帮助我清除我的误解的人都会受到赞赏.

首先是我想要实现的目标.我试图编写一个简短的程序,创建一个MulticastSocket绑定它(即监听)在特定的网络适配器上,然后加入一个特定的多播组.我已经尝试了以下(客户端)代码,该代码工作正常,我可以在没有多播套接字超时的情况下组播数据包.

public class Main {
public static final int DEFAULT_MULTICAST_PORT = 5555;
public static final String multicastGroup = "225.4.5.6";
public static final String adapterName = "eth0";
public static final int MAX_PACKET_SIZE = 65507;

CharBuffer charBuffer = null;
Charset charset = Charset.defaultCharset();
CharsetDecoder decoder = charset.newDecoder();
static ByteBuffer message = ByteBuffer.allocateDirect(MAX_PACKET_SIZE);
static boolean loop = true;

static byte[] buffer = new byte[MAX_PACKET_SIZE];

public static void main(String[] args) {

    try {
        //MulticastSocket mSocket …
Run Code Online (Sandbox Code Playgroud)

java multicast multicastsocket

7
推荐指数
1
解决办法
6204
查看次数

Java MulticastSocket线程是否安全?

我有两个主题.第一个用循环发送MulticastSocket的数据报; 第二个线程使用循环中的MulticastSocket的相同实例接收数据报.

它似乎工作正常,但我仍然怀疑.

这两个线程可以使用相同的MulticastSocket实例吗?在发送/接收方法调用方面,MulticastSocket线程是否安全?

java multithreading multicastsocket

6
推荐指数
1
解决办法
2330
查看次数

java.net.SocketException:不是多播地址

我正在使用MulticastSocket,当我尝试加入一个组时,当我在"localhost"ip上运行组时,它永远不会工作.但是,我发现这篇文章http://lycog.com/programming/multicast-programming-java/表明范围应该在224.0.0.1和239.255.255.254之间.当我从该IP中创建一个InetAddress并加入该组时,它就可以工作了.请解释为什么这是必要的.

例:

InetAddress group = InetAddress.getByName("localhost");
int port = 8888;
MulticastSocket socket = new MulticastSocket(port);
socket.joinGroup(group);
Run Code Online (Sandbox Code Playgroud)

//抛出

Unable to connect to host:localhost on port:8888
java.net.SocketException: Not a multicast address
Run Code Online (Sandbox Code Playgroud)

有效的示例:

InetAddress group = InetAddress.getByName("224.0.0.1");
int port = 8888;
MulticastSocket socket = new MulticastSocket(port);
socket.joinGroup(group);
Run Code Online (Sandbox Code Playgroud)

java networking network-programming datagram multicastsocket

6
推荐指数
1
解决办法
6164
查看次数

从Linux上的特定网络接口接收多播

我正在尝试从CentOS 5.5上的特定网络接口接收组播数据

sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(1234);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(sd, (sockaddr*)&addr, sizeof(sockaddr_in));
setsockopt(sd, SOL_SOCKET, SO_BINDTODEVICE, "eth0", 5);
Run Code Online (Sandbox Code Playgroud)

但是我收到了来自所有接口的数据包.

怎么了?

linux networking multicast multicastsocket

5
推荐指数
1
解决办法
3537
查看次数

如何最大限度地减少UDP丢包

我每秒接收~3000个UDP数据包,每个数据包大小约为200字节.我写了一个java应用程序,它监听那些UDP数据包并将数据写入文件.然后,服务器以先前指定的速率发送15000条消息.写入文件后,它只包含~3500条消息.使用wireshark我确认我的网络接口收到了所有15000条消息.之后我尝试更改套接字的缓冲区大小(最初为8496bytes):

(java.net.MulticastSocket)socket.setReceiveBufferSize(32*1024);
Run Code Online (Sandbox Code Playgroud)

该更改将保存的消息数量增加到~8000.我不断将缓冲区大小增加到1MB.之后,保存的消息数量达到~14400.将缓冲区大小增加到更大的值不会增加保存的消息数.我想我已达到允许的最大缓冲区大小.不过,我需要捕获网络接口收到的所有15000条消息.

任何帮助,将不胜感激.提前致谢.

java udp multicast multicastsocket

5
推荐指数
1
解决办法
1万
查看次数

通过无线网络使用多播套接字的 UDP

我编写了一个带有多播套接字的简单 udp 服务器客户端应用程序。服务器每 6 毫秒向三个客户端发送数据包。数据包大小为 1200 字节。这是每秒 166,66 个数据包。每当客户端检测到丢失的数据包时,它就会通过单播向服务器发送 NACK 数据包。

第一次测试: 服务器和三个客户端通过以太网连接到路由器 TP-Link TL-WDR4300 (dd-wrt),一切正常。

第二次测试: 只有服务器通过以太网连接到路由器,其他客户端通过无线2.4GHz和固定信道连接。无线存在两个问题:第一个问题是数据包丢失,客户端仅收到 50% 的数据包。并且丢失会突然出现,例如收到 400 个数据包,丢失 200 个数据包等。第二个问题是,当客户端将 NACK 数据包发送回服务器时,我可以在 Wireshark 上看到该数据包,但我的应用程序无法接收它们。这很奇怪,因为代码与客户端通过以太网连接时的代码相同。那么,有什么想法吗?我会很感激

服务器代码:

while (1) {

    FD_ZERO(&readfds);
    FD_SET(sd, &readfds);

    tv.tv_sec = 0;
    tv.tv_usec = 0;

    rv = select(sd + 1, &readfds, NULL, NULL, &tv);

    while (rv == 1) {

        nack_processing(sd);
        rv = select(sd + 1, &readfds, NULL, NULL, &tv);


    }
}
return 0;

}
Run Code Online (Sandbox Code Playgroud)

我还进行了更新以减少流量:数据包大小:800 字节数据包之间的到达时间间隔:10 毫秒 = 每秒 100 …

c udp multicastsocket

5
推荐指数
1
解决办法
1295
查看次数

偶尔出现 java.io.IOException:仅在 Android 7.0 上不允许通过 DatagramSocket.send() 进行操作

以下代码在所有 Android 设备 Android 7.0 上几乎 100% 运行良好:

DatagramSocket clientSocket = new DatagramSocket();
clientSocket.setSoTimeout(4000);
clientSocket.setReuseAddress(true);        
clientSocket.setBroadcast(true);
...
DatagramPacket dpSend = new DatagramPacket(baSendData, baSendData.length, InetAddress.getByName("239.255.255.250"), 3702);
clientSocket.send(dpSend);
Run Code Online (Sandbox Code Playgroud)

在 Android 7.0 上,仅在 Android 7.0 上,clientSocket.send(dpSend) 偶尔会生成以下错误。我想强调“偶尔”。大多数时候它工作得很好。

我想知道是否有人可以提供对 Android 7.0 的任何见解,以阐明为什么异常仅发生在 Android 7.0 上。

sockets multicast datagram multicastsocket android-7.0-nougat

5
推荐指数
0
解决办法
858
查看次数