c#udp socket通信 - 通常只允许使用每个套接字地址(协议/网络地址/端口)

时间:2014-07-22 04:45:41

标签: c# udp

我正在尝试制作两个应用程序。一个将数据发送到特定的udp端口,另一个将读取它。 我有两个问题:

  1. 在同一台机器上运行时,出现错误:“只有一次使用 每个套接字地址(协议/网络地址/端口)通常是 允许“所以如果我不能,我需要弄清楚如何测试它 同一端口的多个套接字连接。
  2. 当我尝试使用时 我的网络中的另一台计算机的内部IP,我没有得到 任何阅读都可以。
  3. 服务器:

    private Socket sock;
    private const int PORT = 5000;
    public void start()
    {
            sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            sock.ReceiveTimeout = 1;// seconds
            sock.SendTimeout = 1;// seconds
            IPEndPoint iep = new IPEndPoint(IPAddress.Any, PORT);
            EndPoint ep = (EndPoint)iep;
            sock.Bind(iep);
            MulticastView view_obj = new MulticastView();
            while(true)
            {
                try
                {
                    if (sock.Connected)
                    {
                        sock.Send(Serializer.ObjectToByteArray(view_obj));
                    }
                }catch(Exception ex){
                    Console.WriteLine(ex);
                }
                Thread.Sleep(1000); // milliseconds
            }
    }
    

    客户端:

            IPAddress ip = IPAddress.Parse("127.0.0.1");
            IPEndPoint iep = new IPEndPoint(ip, PORT);
            EndPoint ep = (EndPoint)iep;
            UdpClient client = new UdpClient(PORT);
            IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
            // or using: Byte[] receiveBytes = client.Receive(ref ep); 
            Byte[] receiveBytes = client.Receive(ref RemoteIpEndPoint); 
            MulticastView view;
            view = (MulticastView)Serializer.ByteArrayToObject(receiveBytes);
    

    请注意,我需要单独的应用程序(在单独的进程中)。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

您无法在同一IP地址/端口上打开2个独立的套接字。每个IP /端口都是一个独特的邮箱,可以这么说。 (从技术上讲,在某些情况下,可以将2个进程连接到同一个插槽,但这与您的问题无关)。规则很简单,但解决方法有几种。

我会问客户端是否真的需要一个标准的端口号。通常,UDP / TCP客户端只使用随机套接字并与服务器通信。服务器通常是连接的唯一需要标准固定端口的一面。 UdpClient.Receive()方法将使用数据包发件人的ip / port填充IPEndPoint,以便您可以回复它。

要么不要绑定到IPAddress.Any(导致它绑定到所有接口)。将Any替换为特定IP地址(如果您设置IP别名或多个适配器,则一台计算机可以有多个),或者更简单,将客户端的端口号更改为与服务器不同。您应该能够将一端绑定到主以太网接口IP地址,并将客户端绑定到环回(127.0.0.1)地址。

答案 1 :(得分:1)

尽管这是一个古老的问题,但我认为指出单端口规则的例外情况会很好。

如果使用多播(UDP为多播地址),则可以设置SO_REUSEADDR选项以将端口用于多个套接字。

答案 2 :(得分:0)

如果我的解决方案可以解决您的问题,请给我投票,

(首先,对不起我的英语不好)

长话短说,对于UDP,请使用sendasync而不是send。发送后!只是使用 socket.close(); 示例:

UdpClient socket = new UdpClient(port);
IPEndPoint target = new IPEndPoint(Ipaddress,port);
socket.SendAsync(message,message.length,target);
Console.writeline("message sent");
socket.Close();

创建一个这样的类,调用该类并将您的消息放入字符串中,然后将其传递给该类。该类将使用该端口打开一个套接字,发送消息。然后关闭插座。甚至对您的网络更健康,而不是不断更改端口。为了安全?离开这里,此方法具有(0安全性)。您只需为邮件添加加密即可,仅此而已。我会飞走的... ~~~~~