Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用UDP打开TCP端口?_C#_Sockets_Tcp_Udp_Firewall - Fatal编程技术网

C# 使用UDP打开TCP端口?

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)在本地运行时,我得到一个异常,一个套接字操作试图

我读了一些关于使用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是两个不同的端口,尽管编号相同。