【问题标题】:c# udp socket communication - Only one usage of each socket address (protocol/network address/port) is normally permittedc# udp socket 通信 - 每个套接字地址(协议/网络地址/端口)通常只允许使用一次
【发布时间】:2014-07-22 04:45:41
【问题描述】:

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

我有两个问题:

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

服务器:

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);

请注意,我需要单独的应用程序(在单独的进程上)。

【问题讨论】:

  • UDP 不是面向连接的。目前还不清楚你想要发生什么。请澄清。
  • 你为什么要检查 sock.Connected?

标签: c# udp


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢。简而言之,UdpClient 是用来发送数据的,当你不断地从它读取数据时,你会绑定到一个端口。我反其道而行之。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 2019-05-03
    • 2017-06-09
    • 2011-01-15
    • 2010-11-23
    相关资源
    最近更新 更多