【问题标题】:How to implement a multicast socket in c++如何在 C++ 中实现多播套接字
【发布时间】:2011-04-06 10:18:27
【问题描述】:

我是一名 c# 程序员,我需要在 c++ 中实现一个多播套接字。
我尝试用谷歌搜索它并没有找到太多帮助。
因此,如果有人可以给我一些好的 c++ 多播套接字教程的链接,我们将不胜感激。
我的 c# 套接字实现如下所示:

public class UdpMulticast
    {
        private Socket s;
        private Thread listenThread;
        private string mcastGroup;
        private int port;

        public UdpMulticast(string mcastGroup, int port)
        {
            this.mcastGroup = mcastGroup;
            this.port = port; 
        }

        private void Listen()
        {
            while (true)
            {
                try
                {
                    byte[] b = new byte[1024];
                    Thread.Sleep(1);                    
                    int recv = s.Receive(b);
                    if (OnNewDataRecv != null)
                    {
                        byte[] tmp = new byte[recv];
                        for (int i = 0; i < recv; i++)
                        {
                            tmp[i] = b[i];
                        }
                        byte[] decByte = Encryption.Decrypt(tmp);
                        if(this.OnNewDataRecv !=null)
                            this.OnNewDataRecv(decByte, decByte.Length);                        
                    }

                    if (s == null)
                    {
                        break;
                    }
                }
                catch (ThreadAbortException)
                {
                    break;
                }
                catch (Exception ex)
                {

                    Console.WriteLine(ex.ToString());
                }
            }
        }

        public delegate void newData4Send(byte[] data, int dataLen);
        public event newData4Send OnNewDataRecv;

        public bool StartListen()
        {
            bool ret = false;
            try
            {
                if (s == null)
                {
                    s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                }
                if (s != null)
                {
                    Console.WriteLine("PORT multi cast :" + port);
                    IPEndPoint ipep = new IPEndPoint(IPAddress.Any, port);
                    s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
                    s.Bind(ipep);
                    IPAddress ip = IPAddress.Parse(mcastGroup);
                    s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(ip, IPAddress.Any));
                    s.SetSocketOption(SocketOptionLevel.IP,
                            SocketOptionName.MulticastTimeToLive, int.Parse("1"));
                    listenThread = new Thread(new ThreadStart(Listen));
                    listenThread.IsBackground = true;
                }
                if (listenThread != null)
                    listenThread.Start();
                ret = true;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            return ret;
        }

        public void StopListen()
        {
            if (listenThread != null)
            {
                if (listenThread.IsAlive)
                {
                    listenThread.Abort();
                    listenThread = null;
                }
            }
            if (s != null)
            {
                s.Close();
                s = null;
            }
        }

        public void Send(byte[] data, int len)
        {
            if (s == null)
            {
                s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            }

            if (s != null)
            {
                IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(mcastGroup), port);
                byte[] encByte = Encryption.Encrypt(data);
                s.SendTo(encByte, encByte.Length, SocketFlags.None, ipep);
            }
            else Console.WriteLine("s is NULL");
        }
    }

我想我在 wcf 中找到了一些关于它的内容,但我找不到好的教程。

【问题讨论】:

    标签: c++ multithreading wcf sockets multicastsocket


    【解决方案1】:

    没有 Socket 类或某事。在纯 C++ 中类似。我建议使用像 Boost.Asio 这样的框架。

    http://www.boost.org/doc/libs/1_46_1/doc/html/boost_asio/examples.html

    文档中有一个多播示例。

    【讨论】:

    • 这不是 c++ 的 Socket 类吗#include #include
    • 这些是用于处理套接字 (TCP/IP) 的纯 C 函数。通常您不想直接使用这些低级套接字函数,因为它比仅使用更高级别的框架要复杂得多。
    • @duselbaer 这是一篇古老的帖子,但在寻找答案时发现一篇写着“使用提升”的帖子令人沮丧。我个人认为 boost 很棒,但如果有人试图自己实现多播,这是一个糟糕的答案。
    • @Connor Hollis 如果不提​​升,你会对 OP 有什么建议?我也有同样的问题。我想使用 c++ 为自己制作一个多播示例。平台无关紧要。
    • @Guarav Boost 很棒。我认为这是许多休闲和专业程序员“不要重新发明轮子”的答案。我遇到的问题是任何库都可能混淆手头问题的实际功能。如果有人想知道如何实现多播,那么 Boost 不是 stackoverflow 的答案。如果有人需要多播,那么 Boost 可以是答案。希望这不是太切题,可以帮助您朝着正确的方向前进。
    猜你喜欢
    • 2014-07-12
    • 2018-05-04
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    相关资源
    最近更新 更多