【问题标题】:Multicast packets: sending and receiving issues多播数据包:发送和接收问题
【发布时间】:2015-12-03 01:24:28
【问题描述】:

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

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

问题:

发送时,另一个名为receiveMessage() 的方法正在单独的线程上运行。使用Socket.Bind()抓包,但只抓到1个包。

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

更新

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

发送方法

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();

接收方式

//initialise multicast group and bind to interface
Socket _sender_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, _PORT);
_sender_socket.Bind(ipep);

IPAddress localip = _MultiIP;
_sender_socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(localip, IPAddress.Any));

//{
while (_sender_socket.IsBound && !bStop)
{
    byte[] b = new byte[_BYTE_BUFFER_SIZE];
    _sender_socket.Receive(b);
    char[] chars = new char[_BYTE_BUFFER_SIZE];
    System.Buffer.BlockCopy(b, 0, chars, 0, b.Length);

    string _message = new string(chars).Trim();
    string ip = _message.Substring(0, _message.IndexOf("~"));
    _message = _message.Remove(0, _message.IndexOf("~") + 1);
    string _flag = _message.Substring(0, _message.IndexOf("~"));
    _message = _message.Remove(0, _message.IndexOf("~") + 1);

    _message = _message.Replace("\0", string.Empty);

    ip = "1.0";
    icount++;
    handleData(ip, _flag, _message);
}

【问题讨论】:

    标签: c# multicastsocket


    【解决方案1】:

    发件人不必绑定或添加成员资格。任何数据报套接字都可以发送到多播地址。接收方需要将成员资格添加到多播地址。发送方和接收方也需要就端口达成一致(接收方应该绑定端口)

    您在每个示例中的多播选项的参数都颠倒了。

    套接字已经从内核缓冲,因此您不需要使用消息队列使代码复杂化。

    【讨论】:

      【解决方案2】:

      如果您不想尝试,这里有一个完全工作示例:https://github.com/efaruk/playground/tree/master/Multicasting

      如果您愿意,可以在项目中使用这些可重复使用的组件(MulticastSenderMulticastReceiver)...

      【讨论】:

        猜你喜欢
        • 2014-11-14
        • 1970-01-01
        • 2012-01-18
        • 1970-01-01
        • 2011-11-22
        • 1970-01-01
        • 2012-10-03
        • 2012-05-20
        • 2011-05-30
        相关资源
        最近更新 更多