使用Delphi进行P2P连接

时间:2013-07-23 06:13:52

标签: delphi sockets ftp p2p

我问的是,可以直接从互联网连接两个应用程序,而无需使用公共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组件? 我真的不知道该做什么,或者任何直接连接的选项。

感谢

2 个答案:

答案 0 :(得分:2)

请查看套接字单元以及TTCPClient和TTCPServer对象:

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

答案 1 :(得分:2)

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

你有很多方法可以用Delphi进行交流

  1. 使用Windows标准库WinSocet和Wininet - 搜索MSDN
  2. 使用http://www.ararat.cz
  3. 中的synapse库
  4. 使用http://www.overbyte.be
  5. 中的Internet Communication Suite
  6. 使用http://www.indyproject.org/Sockets/wizard/DownloadWizard.en.aspx
  7. 中的Internet Direct库

    这可能适合您在平面局域网环境中工作,制作https://sourceforge.net/projects/dreamchat/

    等应用程序

    但是,如果您想进入互联网(如FTP标签建议),您最好切换策略。


    p2p的问题包括

    _1。找到对方:

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

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

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

    _2。检查对方是否值得您的信任。对于由文件哈希保证的文件交换P2P(在上传正确内容时,谁关心对等方是公平的还是恶意的)。对于电脑游戏,通常会使用一些AntiCheat工具取得好成绩。

    _2a确保所有中间同伴都无法窃听您的数据(或者您不关心他们是否这样做)并且他们无法故意篡改数据或因某些随机错误而破坏数据,如果没有这个事实,你的程序会发出通知,并要求重复传输。

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

    _3a。获得一些公开可见的自己的知识产权或其自身的知识产权

    _3b。将此地址传达给未知但同伴

    _3c。确保该地址实际上可用于通信,这意味着使用UDP,NatPMP,UPnP和其他特殊技术对NAT或几个嵌套NAT进行管理,测试它们中的任何一个是否能够与给定的NAT一起工作。在某些情况下,也许可以使用IPv6 / TEREDO。

    _3d。在没有任何对等方可以建立工作的情况下优雅地降级到某些重新翻译镜像服务器" direct"公开演讲。

    所有这些问题都有它们的一堆蠕虫而且你无法立即解决问题。您将不得不逐个处理它们,包括提问和搜索维基百科的浏览量和教程。


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

    1. XMPP又名Jabber。今天很多人都拥有Google Mail(和GTalk)或Yandex Mail(以及Yandex在线)等帐号。您的应用程序可能使用XMPP库连接到这些帐户并将其用于实时基于XML的通信。从严格意义上讲,它既不是P2P,也不是P2P,而是需要沟通,而不是严格遵循术语。

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

    3. https://gnunet.org/

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

    5. 面向游戏的服务,如Hamachi.cc

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

    7. 等等 - 只需进行搜索。已经建立的网络多年来已经处理了这些挑战和出牙问题,并且您可以更好地重复使用他们的经验,浪费时间和精力来发展自己的劣势(以及将来会是次要的)解决方案