为什么 socket.BeginConnect() 即使没有服务器也总是成功

Why does socket.BeginConnect() always succeed even if there is no server

为什么 Socket.BeginConnect() 总是成功?我已经编写了以下代码来说明我的观点,如果您 运行 只是这段代码,则没有服务器监听,它可能无法连接到任何东西,但它可以正常工作。

private static Socket mSocket;
static void Main(string[] args)
{
    mSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);
    mSocket.BeginConnect(remoteEndPoint.Address, remoteEndPoint.Port, new AsyncCallback(OnConnect), null);
    Console.Read();
}

static void OnConnect(IAsyncResult asyncResult)
{
    try
    {
        mSocket.EndConnect(asyncResult);
        Console.WriteLine(mSocket.Connected);
    }
    catch(Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

某些 System.Net.Sockets.Socket 方法在您使用时不起作用:SocketType.Dgram, ProtocolType.Udp 就像 Socket.Listen() 但 Socket.Connect/BeginConnect() 仍然有效,这很好,这意味着客户端具有与 TCP 完全相同的 UDP 代码(我已经拥有)但是为什么呢? UDP 应该是少连接所以建立连接(对我来说)没有意义。

如果有一个 Socket.accept 可以接受想要连接的 UDP 客户端,我可能会理解(因为那样它会保持统一,您可以将其中一个用于 TCP 或 UDP)

"Connecting"一个UDP套接字只是意味着目标地址设置在套接字上。但与 TCP 相反,不会与对等方交换任何数据包,因此根本不知道是否可以到达服务器。