在Xamarin (c#)中使用UDP套接字连接到远程端点仅在激活VPN时有效



我有一个UDP套接字连接,在具有本地ip (192.168.x.x)的设备之间工作,我想切换到与外部服务器的连接,使用以下配置:

private Socket _socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
private const int bufSize = 4096 * 4;
private State state = new State();
private EndPoint epFrom = new IPEndPoint(IPAddress.Any, 0);
private AsyncCallback recv = null;
private static int PORT = 27000;

打开设备作为服务器通过套接字侦听

_socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.ReuseAddress, true);
_socket.Bind(new IPEndPoint(IPAddress.Any, port));
Receive(); // Function to receive datagrams through the socket, irrelevant to this issue

连接套接字到远程端点

// {address:port} of an external server
_socket.Connect(new IPEndPoint(IPAddress.Parse(address), port));

发送数据到套接字

_socket.BeginSend(data, 0, data.Length, SocketFlags.None, (ar) =>
{
try
{
_socket.EndSend(ar);
}
catch (Exception ex)
{
Console.WriteLine("[UDP] Error Send: " + ex.ToString());
}
}, state);

上面的代码对于本地IP地址工作得很好,但是当试图使用远程服务器的公共IP作为远程IP端点时出现了问题。

数据报似乎已经发送,但它从未到达服务器。我试图将手机连接到VPN,但本地IP地址从192.168.x更改了。X的10.0 X次方。X,然后与外部服务器的连接正常。

因此,只有当设备的IP是a类私有IP时,与外部IP的连接才有效,但它不适用于C类范围(https://www.meridianoutpost.com/resources/articles/IP-classes.php)。

我想找到一个解决方案,能够连接到外部IP地址,而不必连接第三方VPN软件。

如果有人有同样的问题,我已经解决了。

要使用本地C类ip访问外部ip并且没有VPN,您应该使用UDP打孔而不是尝试建立连接。

删除。connect()和。bind()方法,而不是使用BeginSend/EndSend,使用SendTo或SendToAsync方法,以服务器的公共IP作为端点目的地。

另外,我建议修改:

SocketOptionName.ReuseAddress

:

SocketOptionName.PacketInformation

最新更新