UDP组播。 C#

时间:2014-05-24 14:27:52

标签: c# sockets udp multicast

我尝试向该群组的所有成员发送消息。发信人:

// Create socket
        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

        // Multicast IP-address
        IPAddress ip = IPAddress.Parse("224.168.55.25");

        // Join multicast group
        s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(ip));

        // TTL
        s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 2);

        // Create an endpoint
        IPEndPoint ipep = new IPEndPoint(ip, 4567);

        // Connect to the endpoint
        s.Connect(ipep);

        // Scan message
         while (true)
        {
            byte[] buffer = new byte[1024];
            string msg = Console.ReadLine();
            buffer = Encoding.ASCII.GetBytes(msg);
            s.Send(buffer, buffer.Length, SocketFlags.None);
            if (msg.Equals("Bye!", StringComparison.Ordinal))
                break;
        }

        // Close socket
        s.Close();

接收器:

// Create new socket
        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

        // Create IP endpoint
        IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 4567);

        // Bind endpoint to the socket
        s.Bind(ipep);

        // Multicast IP-address
        IPAddress ip = IPAddress.Parse("224.168.55.25");

        // Add socket to the multicast group
        s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(ip, IPAddress.Any));

        // Receive messages
        while (true)
        {
            byte[] data = new byte[1024];
            s.Receive(data);
            string str = System.Text.Encoding.ASCII.GetString(data, 0, data.Length);
            Console.WriteLine(str.Trim());
            if (str.Equals("Bye!", StringComparison.Ordinal))
            {
                break;
            }
        }

我不明白为什么当我在客户端将它们打印到屏幕上时,消息之间有很多可用空间?为什么Receiver程序中的循环在收到消息Bye!后不会停止?我该如何解决这个问题?

非常感谢!

2 个答案:

答案 0 :(得分:1)

您正在创建一个udp套接字。 Udp套接字不是面向连接的。所以它只是接收消息而不知道发送者的状态。即使发送方套接字关闭,接收方也会继续收听。 我希望我能正确理解你的问题。

if (strData.Trim().Equals("Bye!", StringComparison.Ordinal))
{
                Console.WriteLine("that's right");
                break;
}

答案 1 :(得分:0)

Socket.Receive()返回接收到的字节,您应该使用返回值来生成字符串,否则您将获得长度为1024的字符串,并且Trim无法处理它。

int len = s.Receive(data);
string str = System.Text.Encoding.ASCII.GetString(data, 0, len);