C# 使用UDP打开TCP端口?
我读了一些关于使用UDP打开端口的内容。我找不到我读过的原始页面,但我确实找到了答案 我试着运行这个代码。也许我做错了什么?这个想法(在上面的链接中)是Alice监听端口5412,从5412(tcp端口)向bob发送一个UDP数据包到5411。Bob(不监听)使用TCP端口5411(udp端口)连接到Alice 5412。我使用bob上的命令行给出alice的IP地址 我做错了吗?当我使用我的公共IP地址(和我的网络地址,但不是127.0.0.1)在本地运行时,我得到一个异常C# 使用UDP打开TCP端口?,c#,sockets,tcp,udp,firewall,C#,Sockets,Tcp,Udp,Firewall,我读了一些关于使用UDP打开端口的内容。我找不到我读过的原始页面,但我确实找到了答案 我试着运行这个代码。也许我做错了什么?这个想法(在上面的链接中)是Alice监听端口5412,从5412(tcp端口)向bob发送一个UDP数据包到5411。Bob(不监听)使用TCP端口5411(udp端口)连接到Alice 5412。我使用bob上的命令行给出alice的IP地址 我做错了吗?当我使用我的公共IP地址(和我的网络地址,但不是127.0.0.1)在本地运行时,我得到一个异常,一个套接字操作试图
,一个套接字操作试图访问一个不可访问的网络。当我在Bob上运行它时,我得到一个连接超时异常
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;
namespace TcpTest
{
class Program
{
static string localIp = "127.0.0.1";
static string remoteIP = ipaddr;
static void Main(string[] args)
{
//run remotely to connect to you using TCP
if (args.Count() > 0)
{
var t = new TcpClient(new IPEndPoint(IPAddress.Parse(localIp), 5411)); //Force port
t.Connect(args[0], 5412);
return;
}
//Run locally
//Bind TCP port
var l = new TcpListener(5412);
l.Start();
//Send UDP using the listening port to remote address/port
var u = new UdpClient(5412);
u.Connect(remoteIP, 5411);
var buf = new byte[10];
u.Send(buf, buf.Length);
//R
new Thread(SimulateRemote).Start();
//L
var c = l.AcceptTcpClient();
var af=c.Client.RemoteEndPoint;
}
static void SimulateRemote()
{
Thread.Sleep(500);
var t = new TcpClient(new IPEndPoint(IPAddress.Parse(localIp), 5411)); //Force port
t.Connect(myipaddr, 5412);
}
}
}
你不能那样做。
TCP端口和UDP端口无法相互连接。从UdpClient.send()
发送的数据包的Protocol
字段设置为0x11
,这是UDP的值,但TCP堆栈仅识别Protocol
设置为0x06
的数据包,这是TCP的值。这是IP模块最基本操作的一部分。查看您是否需要详细信息。您不能这样做。
TCP端口和UDP端口无法相互连接。从UdpClient.send()
发送的数据包的Protocol
字段设置为0x11
,这是UDP的值,但TCP堆栈仅识别Protocol
设置为0x06
的数据包,这是TCP的值。这是IP模块最基本操作的一部分。看看你是否想知道细节。听起来不错,但我看到至少有两篇帖子说我可以做到。不连接,但当我使用UDP连接时,让防火墙通过TCP连接。你知道我怎样才能在防火墙/路由器上捅个洞吗?@acidzombie24要么帖子错了,要么你误解了。对UDP连接执行此操作很常见。TCP是不同的。任何防火墙都会识别并分隔TCP和UDP端口空间。我链接的答案正好是令人惊讶的是,打孔也适用于TCP。在传出SYN数据包后,防火墙/NAT路由器会将具有适当IP地址和端口的传入数据包转发到LAN,即使它们无法确认或确认错误的序列号(ACK)。“第一页介绍了我使用的步骤。带有SYN的TCP数据包和UDP数据包之间有很大的区别。没有防火墙会把它们错当成彼此。所以链接完全错了?那太糟糕了。这里希望有TCP洞Punching听起来不错,但我看到至少有两个帖子说我能做到。不连接,但当我使用UDP连接时,让防火墙通过TCP连接。你知道我怎样才能在防火墙/路由器上捅个洞吗?@acidzombie24要么帖子错了,要么你误解了。对UDP连接执行此操作很常见。TCP是不同的。任何防火墙都会识别并分隔TCP和UDP端口空间。我链接的答案正好是令人惊讶的是,打孔也适用于TCP。在传出SYN数据包后,防火墙/NAT路由器会将具有适当IP地址和端口的传入数据包转发到LAN,即使它们无法确认或确认错误的序列号(ACK)。“第一页介绍了我使用的步骤。带有SYN的TCP数据包和UDP数据包之间有很大的区别。没有防火墙会把它们错当成彼此。所以链接完全错了?那太糟糕了。这里希望有TCP漏洞punchingUDP通信从UDP端口发送到UDP端口。TCP通信从TCP端口发送到TCP端口。没有例外(根据协议规范)。设备(如路由器)可能能够将TCP流量转换为UDP流量或从UDP流量转换为TCP流量,但这种转换并不常见,因为TCP基本上是UDP+更多的数据。如果使用TCP的额外开销,丢弃数据将不会带来什么好处。TCP端口号范围为0到65535,UDP端口号范围为0到65535。UDP端口5411和TCP端口5411是两个不同的端口,尽管编号相同。UDP通信从UDP端口发送到UDP端口。TCP通信从TCP端口发送到TCP端口。没有例外(根据协议规范)。设备(如路由器)可能能够将TCP流量转换为UDP流量或从UDP流量转换为TCP流量,但这种转换并不常见,因为TCP基本上是UDP+更多的数据。如果使用TCP的额外开销,丢弃数据将不会带来什么好处。TCP端口号范围为0到65535,UDP端口号范围为0到65535。UDP端口5411和TCP端口5411是两个不同的端口,尽管编号相同。