2

为什么 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 中的任何一个)

4

1 回答 1

3

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

于 2015-10-07T11:44:56.513 回答