为什么 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 相反,不会与对等方交换任何数据包,因此根本不知道是否可以到达服务器。
为什么 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 相反,不会与对等方交换任何数据包,因此根本不知道是否可以到达服务器。