Как реализовать многоадресный сокет в C ++ - PullRequest
0 голосов
/ 06 апреля 2011

Я программист на c #, и мне нужно реализовать многоадресный сокет в c ++.
Я попытался найти его в Google и не нашел большой помощи.
Так что, если кто-то может дать мне несколько ссылок на хороший учебник по многоадресному сокету 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, но я не могу найти хороший учебник.

1 Ответ

0 голосов
/ 06 апреля 2011

Нет класса Socket или чего-то еще.похоже на простой C ++.Я предлагаю использовать фреймворк, такой как Boost.Asio.

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

В документации приведен пример многоадресной рассылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...