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 メソッドの一部は、使用すると機能しません: Socket.Connect/BeginConnect() のように、それでも機能します。これは、クライアントが TCP とまったく同じ UDP 用のコードを持っていることを意味します (これは既にあります) SocketType.Dgram, ProtocolType.UdpSocket.Listen()持っています)しかし、なぜですか?UDPは接続が少ないと想定されているため、(私にとって)接続を確立することは意味がありません。

接続したいUDPクライアントを受け入れる際に機能するSocket.acceptがあった場合、理解できるかもしれません(それは均一のままで、TCPまたはUDPのいずれかを使用できるためです)

4

1 に答える 1

3

UDP ソケットの「接続」は、ターゲット アドレスがソケットに設定されていることを意味します。ただし、TCP とは異なり、パケットはピアと交換されないため、サーバーに到達できるかどうかはまったくわかりません。

于 2015-10-07T11:44:56.513 に答える