You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于UDP的不同端口双向通信实现问题(C#/.NET)

C# .NET UDP Socket双端口通信问题解答

核心结论

要实现服务器在2004端口接收、2010端口发送,客户端从2010端口接收、向服务器2004端口发送的需求,必须为服务器创建两个独立的Socket:

  • 一个Socket绑定本地2004端口,专门用于接收客户端消息
  • 另一个Socket绑定本地2010端口,专门用于向客户端发送消息

客户端同理:

  • 一个Socket绑定本地2010端口,用于接收服务器消息
  • 若要求客户端固定端口发送,需再创建一个绑定本地2004端口的Socket;若无需固定,发送Socket可省略绑定步骤,由系统自动分配端口

修正后的代码示例

客户端代码

// 绑定本地2010端口,用于接收服务器消息
Socket receiveSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint clientReceiveEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2010);
receiveSocket.Bind(clientReceiveEP);

// 绑定本地2004端口,用于向服务器发送消息(无需固定端口可省略Bind)
Socket sendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint clientSendEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2004);
sendSocket.Bind(clientSendEP);

// 服务器接收消息的端点(客户端发消息目标)
IPEndPoint serverReceiveEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2004);

服务器代码

// 绑定本地2004端口,用于接收客户端消息
Socket receiveSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint serverReceiveEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2004);
receiveSocket.Bind(serverReceiveEP);

// 绑定本地2010端口,用于向客户端发送消息
Socket sendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint serverSendEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2010);
sendSocket.Bind(serverSendEP);

// 客户端接收消息的端点(服务器发消息目标)
IPEndPoint clientReceiveEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2010);

ReceiveFrom与SendTo的正确用法

UDP是无连接协议,收发必须明确指定目标/来源端点:

客户端收发逻辑

  1. 发送消息到服务器:
    使用发送Socket的SendTo方法,目标为服务器2004端口:

    byte[] sendBuffer = Encoding.UTF8.GetBytes("Hello Server");
    sendSocket.SendTo(sendBuffer, serverReceiveEP);
    
  2. 接收服务器消息:
    使用接收Socket的ReceiveFrom方法,传入空端点变量存储服务器来源信息:

    byte[] receiveBuffer = new byte[1024];
    EndPoint remoteServerEP = new IPEndPoint(IPAddress.Any, 0);
    int bytesReceived = receiveSocket.ReceiveFrom(receiveBuffer, ref remoteServerEP);
    string message = Encoding.UTF8.GetString(receiveBuffer, 0, bytesReceived);
    

服务器收发逻辑

  1. 接收客户端消息:
    使用接收Socket的ReceiveFrom方法,获取客户端来源端点:

    byte[] receiveBuffer = new byte[1024];
    EndPoint clientEP = new IPEndPoint(IPAddress.Any, 0);
    int bytesReceived = receiveSocket.ReceiveFrom(receiveBuffer, ref clientEP);
    string message = Encoding.UTF8.GetString(receiveBuffer, 0, bytesReceived);
    
  2. 发送消息到客户端:
    使用发送Socket的SendTo方法,目标为客户端2010端口:

    byte[] sendBuffer = Encoding.UTF8.GetBytes("Hello Client");
    sendSocket.SendTo(sendBuffer, clientReceiveEP);
    

关键注意事项

  • 单个Socket只能绑定一个本地端口,双端口收发必须拆分Socket
  • 客户端发送Socket若无需固定端口,可跳过Bind步骤,不影响通信
  • 确保本地防火墙允许2004、2010端口的UDP流量通过

内容的提问来源于stack exchange,提问作者noelhermans

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 21:15:44