我有一个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