【问题标题】:P2P Connection using Delphi使用 Delphi 的 P2P 连接
【发布时间】:2025-12-01 13:20:05
【问题描述】:

我问的是这是否可以直接从互联网连接两个应用程序,而不使用公共 IP 地址作为隧道或连接器。

我使用此代码从不同的网络连接连接每台计算机。

客户端使用FTP上传文件发送到公共IP地址

function UploadToFtp(serverName, userid, password, fileName: string): LongBool;
var
  hNet, hCon: HINTERNET;
begin
  Result := False;
  hNet := InternetOpen('myagent', INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
  if Assigned(hNet) then
  begin
    hCon := InternetConnect(hNet, PChar(servername),
        INTERNET_DEFAULT_FTP_PORT, PChar(userid), PChar(password),
        INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0
    );
    if Assigned(hCon) then
    begin
      Result := FtpPutFile(hCon, PChar(fileName),
          PChar(ExtractFileName(fileName)), FTP_TRANSFER_TYPE_ASCII, 0
      );
      InternetCloseHandle(hCon);
    end else ShowMessage(SysErrorMessage(GetLastError));
    InternetCloseHandle(hNet);
  end else ShowMessage(SysErrorMessage(GetLastError));
end;

从公共IP地址收集信息的服务器。

function DownLoadFileFromFTP(server, username, password, localfile, remotefile: string; port: word = 21): boolean;
var
  hopen, hconnect: HINTERNET;
  good:boolean;
begin
  hopen := InternetOpen('myagent', INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
  hconnect := InternetConnect(hopen, pchar(server), port, pchar(username), pchar(password), INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
  good := FtpGetFile(hconnect, pchar(remotefile), pchar(localfile), false, 0, FTP_TRANSFER_TYPE_UNKNOWN, 0);
  InternetCloseHandle(hconnect);
  Result := good;
end;

> 有没有办法直接连接每台计算机而不使用 FTP,我的意思是套接字?或者有什么方法可以直接连接来自不同网络的两台计算机?

是否在每台计算机上使用(来自 Delphi 的 Web 服务)Web 组件? 我真的不知道该怎么做,或者直接连接每个选项的任何选项。

谢谢

【问题讨论】:

  • 我建议您对诸如 NAT 穿越、公共和私有 IP 之类的事情进行一些研究。

标签: delphi sockets ftp p2p


【解决方案1】:

作为。做出这个答案,以便能够构建文本。

在 Delphi 中有很多交流方式

  1. 使用 Windows 标准库 WinSocet 和 Wininet - 搜索 MSDN
  2. 使用来自http://www.ararat.cz 的突触库
  3. 使用来自http://www.overbyte.be 的 Internet 通信套件
  4. 使用来自http://www.indyproject.org/Sockets/wizard/DownloadWizard.en.aspx 的 Internet Direct 库

这可能适合你在平面局域网环境中工作,制作像https://sourceforge.net/projects/dreamchat/这样的应用程序

但是如果你想进入互联网(如 FTP 标签所建议的那样),你最好改变你的策略。


p2p的问题包括

_1。找到对方:

1a:在一个预定义的会面点(服务器)上,例如 Skype

1b:在用户指定的会面点(服务器)上,例如 E-Donkey2000 或 BitTorrent

1c:或使用免费的互联网扫描,直到找到某人 Gnutella/G2 网络或基于 DHT 的无服务器 BitTorrent。

_2。检查其他对等方是否值得您信任。对于文件散列保证的文件交换 P2P(谁在乎对等方是公平的还是恶意的,而他上传了正确的内容)。对于电脑游戏,通常使用一些反作弊工具取得了不同程度的成功。

_2a 确保所有中间节点都无法窃听您的数据(或者您不在乎他们是否这样做),并且他们不会故意篡改数据或由于某些随机错误而破坏数据,否则事实上,您的程序会发出通知并要求重复传输。

_3。确保可以建立双向通信,即

_3a。获取您自己的一些公开可见的 IP 或它的 erzats

_3b。将此地址传送给未知的对等体

_3c。确保该地址实际上可以用于通信,这意味着使用 UDP、NatPMP、UPnP 和其他临时技术来固定一个 NAT 或多个嵌套 NAT,测试它们中的任何一个是否可以与给定的 NAT 一起工作。也许在某些情况下可以使用 IPv6/TEREDO。

_3d。优雅地降级为一些重新翻译的镜像服务器,以防没有一个对等方可以建立工作的“直接”公共地址。

所有这些问题都有其一罐蠕虫,您无法立即解决。您将不得不一一处理它们,包括提问和搜索*的概述和教程。


我对新手最好的建议不是尝试这样做,而是抛弃 NIH 综合症并重新使用一些已经建立的网络。这可能包括

  1. XMPP 又名 Jabber。今天,许多人在 Google Mail(和 GTalk)或 Yandex Mail(和 Yandex Online)等上都有帐户。您的应用程序可以使用 XMPP 库连接到这些帐户并将它们用于基于 XML 的实时通信。它也不是严格意义上的 P2P,但你需要的是沟通,而不是严格遵守条款。

  2. BitTorrent:uTorrent 最近介绍了 uTorrent DNA - 使用运行 uTorrent 应用程序作为网状网络传播任何自定义数据的 SDK。

  3. https://gnunet.org/

  4. TOR 和 I2P 可能会太慢,因为它们的重点不是快速通信,但它们确实存在。

  5. Hamachi.cc 等面向游戏的服务

  6. TightVNC 或 TeamViewer 等远程控制的帮助台服务,通常可以建立私有 VPN,但需要安装或租用重新翻译的镜像服务器。

等等 - 只需进行搜索即可。已经建立的网络多年来一直在处理这些挑战和初期问题,您最好重用他们浪费时间和精力来开发自己的劣质(并且将来会更劣质)解决方案的经验

【讨论】:

    【解决方案2】:

    请查看 Sockets 单元以及 TTCPClient 和 TTCPServer 对象:

    http://docwiki.embarcadero.com/Libraries/XE4/en/Web.Win.Sockets.TTcpClient

    【讨论】: