Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当存在多个服务器广播时,客户端如何接收多个广播消息?_C#_Sockets_Client Server_Broadcastreceiver_Inter Process Communicat - Fatal编程技术网

C# 当存在多个服务器广播时,客户端如何接收多个广播消息?

C# 当存在多个服务器广播时,客户端如何接收多个广播消息?,c#,sockets,client-server,broadcastreceiver,inter-process-communicat,C#,Sockets,Client Server,Broadcastreceiver,Inter Process Communicat,我正在使用system.Net.Socket从服务器向客户端发送和接收消息。但当多个服务器广播消息时,接收器程序突然关闭,我遇到了问题 我的广播服务器代码如下 using System; using System.Net; using System.Net.Sockets; using System.Text; public class Broadcst { public static void Main() { Socket sock = new Socket

我正在使用system.Net.Socket从服务器向客户端发送和接收消息。但当多个服务器广播消息时,接收器程序突然关闭,我遇到了问题

我的广播服务器代码如下

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

public class Broadcst
{
    public static void Main()
    {
        Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        IPEndPoint iep1 = new IPEndPoint(IPAddress.Broadcast, 9050);
        IPEndPoint iep2 = new IPEndPoint(IPAddress.Parse("192.168.1.255"), 9050);

        string hostname = Dns.GetHostName();
        byte[] data = Encoding.ASCII.GetBytes(hostname);

        sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
        sock.SendTo(data, iep1);
        sock.SendTo(data, iep2);
        sock.Close();
    }
}
我的客户机接收代码如下

  using System;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;

    public class RecvBroadcst
    {
        public static void Main()
        {
            Socket sock = new Socket(AddressFamily.InterNetwork,
                            SocketType.Dgram, ProtocolType.Udp);

While(true){
  IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050);
            sock.Bind(iep);
            EndPoint ep = (EndPoint)iep;
            Console.WriteLine("Ready to receive...");

            byte[] data = new byte[1024];
            int recv = sock.ReceiveFrom(data, ref ep);
            string stringData = Encoding.ASCII.GetString(data, 0, recv);
            Console.WriteLine("received: {0}  from: {1}",
                                  stringData, ep.ToString());

            data = new byte[1024];
            recv = sock.ReceiveFrom(data, ref ep);
            stringData = Encoding.ASCII.GetString(data, 0, recv);
            Console.WriteLine("received: {0}  from: {1}",
                                  stringData, ep.ToString());

}
            sock.Close();
        }
    }
那么,当存在多个服务器广播时,客户端如何接收多个广播消息呢


当我再次从服务器发送消息时,会出现抛出错误,如“每个套接字地址(协议/网络地址/端口)通常只允许使用一次”

您在同一个套接字实例上使用相同的参数多次调用
Bind
(每次迭代一次)。您应该调用
Bind
一次。

我已经用接收方的following解决了上述代码更改的问题。我每次都绑定套接字,所以我现在只绑定一次,每次只迭代从指定端口传入的数据

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

public class RecvBroadcst
{
    public static void Main()
    {
       Socket sock = new Socket(AddressFamily.InterNetwork,
                           SocketType.Dgram, ProtocolType.Udp);
     //  int port_no=Convert.ToInt32(sock.RemoteEndPoint);


         int portnumber = 9050;

            sock = new Socket(AddressFamily.InterNetwork,
                           SocketType.Dgram, ProtocolType.Udp);
            IPEndPoint iep = new IPEndPoint(IPAddress.Any,portnumber);
            sock.Bind(iep);
            EndPoint ep = (EndPoint)iep;
            Console.WriteLine("Ready to receive...");
          // int port_no = Convert.ToInt32(sock.RemoteEndPoint);
            while (true)
            {

                byte[] data = new byte[1024];
                int recv = sock.ReceiveFrom(data, ref ep);
                string stringData = Encoding.ASCII.GetString(data, 0, recv);
                Console.WriteLine("received: {0}  from: {1}",
                                      stringData, ep.ToString());

                //data = new byte[1024];
                //recv = sock.ReceiveFrom(data, ref ep);
                //stringData = Encoding.ASCII.GetString(data, 0, recv);
                //Console.WriteLine("received: {0}  from: {1}",
                //                      stringData, ep.ToString());

                data = null;
            }
            //portnumber--;


        sock.Close();
    }
}

我刚刚成功。感谢您的回复。这非常有帮助。

您的接收器程序在收到一条消息后立即“突然退出”,因为这就是您编写它的方式。如果希望它接收多条消息,请相应地调整代码。这里的问题是什么?我输入了该代码,虽然该代码为true,但当从服务器发送下一条消息时,该代码已关闭,并且应该有任何消息。请参阅我的更新问题该程序不仅仅是“关闭”。由于未处理的异常,它失败。解释这一例外情况很重要。