我想用Java创建简单的聊天程序,它可以在p2p的基础上工作.使用公共服务器仅启动连接.但我甚至不确定这是可能的.
我成功地实现了Java中的聊天解决方案,如果至少有一台PC转发了正确的端口,那么它就可以工作.我还设法使用外部服务器而不必在客户端转发端口.
因此,我甚至可能以某种方式使用公共服务器启动连接,而不是在客户端之间发送数据,从服务器上卸载?
我不太熟悉路由器如何工作,但我希望当你从内部IP呼叫公共服务器时,路由器会记住来自该公共IP的呼叫和传入响应,而不是发送到你的PC.所以我想,也许如果第一个客户端连接到服务器,服务器而不是将信息传递给第二个客户端,也许他们可以以某种方式直接通信?路由器中的规则是否由服务器建立?
我希望我能清楚地解释清楚.如果没有,请原谅.我甚至都不知道这是怎么做到的,我只是想知道我的概念是否有正确的东西,而且我必须更加努力地学习它.谢谢.
我正在开发基于 udp/tcp 的 P2P 文件和实时视频流应用程序。该应用程序将使用 C++ 为 Linux 和 Windows 平台开发。
我们使用 ICE(TCP/UDP 打孔)来实现 P2P。虽然 TCP 确保数据包丢失,但对于 UDP,我需要一种体面的方法来确保必须将数据包传送到其他对等方。
任何链接和建议将不胜感激?
我已经尝试 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 打孔解决方案,但似乎无法在任何地方找到如何在 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)