标签: hole-punching

使用服务器绕过路由器以启动连接

我想用Java创建简单的聊天程序,它可以在p2p的基础上工作.使用公共服务器仅启动连接.但我甚至不确定这是可能的.

我成功地实现了Java中的聊天解决方案,如果至少有一台PC转发了正确的端口,那么它就可以工作.我还设法使用外部服务器而不必在客户端转发端口.

因此,我甚至可能以某种方式使用公共服务器启动连接,而不是在客户端之间发送数据,从服务器上卸载?

我不太熟悉路由器如何工作,但我希望当你从内部IP呼叫公共服务器时,路由器会记住来自该公共IP的呼叫和传入响应,而不是发送到你的PC.所以我想,也许如果第一个客户端连接到服务器,服务器而不是将信息传递给第二个客户端,也许他们可以以某种方式直接通信?路由器中的规则是否由服务器建立?

我希望我能清楚地解释清楚.如果没有,请原谅.我甚至都不知道这是怎么做到的,我只是想知道我的概念是否有正确的东西,而且我必须更加努力地学习它.谢谢.

p2p portforwarding hole-punching

1
推荐指数
1
解决办法
1215
查看次数

udp丢包和恢复

我正在开发基于 udp/tcp 的 P2P 文件和实时视频流应用程序。该应用程序将使用 C++ 为 Linux 和 Windows 平台开发。

我们使用 ICE(TCP/UDP 打孔)来实现 P2P。虽然 TCP 确保数据包丢失,但对于 UDP,我需要一种体面的方法来确保必须将数据包传送到其他对等方。

  1. 我想知道执行此操作的算法或技术。
  2. 是否有任何免费的 thord 方工具/库可以做。

任何链接和建议将不胜感激?

p2p udp network-programming hole-punching

1
推荐指数
1
解决办法
4897
查看次数

基于 TCP 的打孔

我已经尝试 TCP 打孔一段时间了,在涉及基于 TCP 的方法和 C 编程语言时,论坛似乎没有多大帮助。以下是互联网的主要参考资料,

一种。http://www.brynosaurus.com/pub/net/p2pnat/
b. https://wuyongzheng.wordpress.com/2013/01/31/experiment-on-tcp-hole-punching/

我的设置是
客户端 A -- NAT-A -- Internet -- NAT-B -- 客户端 B。

假设客户端 A 知道 B 的公共和私有端点,而 B 知道 A 的端点(我已经编写了一个服务器“S”,用于在对等方之间交换端点信息),并且考虑到两个 NAT 都不对称,是否就足够了(实现 TCP打孔),如果两个客户端反复尝试 connect() 到彼此的公共端点(对于上述设置)?

如果没有,究竟需要做什么才能实现tcp打孔?

我在每个客户端上有两个线程,一个重复向其他客户端发出连接调用,另一个监听来自其他客户端的传入连接。我已确保两个线程中的套接字都绑定到提供给对等方的本地端口。另外,我看到两个 NAT 都保留了端口映射,即本地和公共端口是相同的。然而,我的程序不起作用。

我上面提到的集合服务器“S”是否可以在打洞或创建 NAT 映射中发挥作用,以允许 SYN 请求通过,到达对等方。如果是,必须做什么?

附上代码的相关部分。
connect_with_peer() 是入口点,在服务器“S”提供对等方的公共 ip:port 元组之后,该元组与完成绑定的本地端口一起提供给此函数。此函数产生一个线程( accept_handler() ),该线程也绑定到本地端口并侦听来自对等方的传入连接。如果connect() [主线程] 或accept() [子线程] 成功,connect_with_peer() 将返回一个套接字。

谢谢,
丁卡尔

volatile int quit_connecting=0;

void *accept_handler(void *arg)
{
    int i,psock,cnt=0;
    int port = *((int *)arg);
    ssize_t len;
    int asock,opt,fdmax;
    char str[BUF_SIZE]; …
Run Code Online (Sandbox Code Playgroud)

c tcp hole-punching

1
推荐指数
1
解决办法
2333
查看次数

不同网络间的socket编程

我正在用 C++ 开发一个客户端 - 服务器程序,以将数据从一台计算机传输到另一台计算机。

一切正常,但现在我被要求让它在不同网络的计算机上工作。我到处搜索,但找不到可靠的解决方案。

我已经看到了 TCP 打孔解决方案,但似乎无法在任何地方找到如何在 C++ 中做到这一点。

我希望它像 teamviewer 一样工作,但没有中间服务器。全部以编程方式将我的客户端(在一台计算机上)连接到服务器(在不同网络中的另一台计算机上)。

#include "../include/ip_tunnel_ms_windows_20180815.h" 
#include "../include/message_processor_common_20190410.h"


SOCKET clientSocket;
int n = 0;
void IPTunnel::initialize(void)
{

    if (inputSignals.empty()) {
        printf("server%d\n", n++);
        if (!server()) {
            printf("Error opening server\n");
            ::exit(1);
        }
    }
    else {
        printf("client%d\n", n++);
        if (!client()) {
            printf("Error opening client\n");
            ::exit(1);
        }
    }
}


bool IPTunnel::runBlock(void)
{
    .....
    (transmit data)
    .....
    return true;
}

void IPTunnel::terminate(void) {
    closesocket(clientSocket);
    WSACleanup();
}

bool IPTunnel::server() {
    WSADATA wsData;
    WORD ver = MAKEWORD(2, …
Run Code Online (Sandbox Code Playgroud)

c++ sockets tcp hole-punching

1
推荐指数
1
解决办法
316
查看次数

标签 统计

hole-punching ×4

p2p ×2

tcp ×2

c ×1

c++ ×1

network-programming ×1

portforwarding ×1

sockets ×1

udp ×1