TinyP2P

꼬마앙마의 이미지

세계에서 가장 적은 코드를 사용한 P2P라고 합니다.

Python버전

# tinyp2p.py 1.0 (documentation at http://freedom-to-tinker.com/tinyp2p.html)
import sys, os, SimpleXMLRPCServer, xmlrpclib, re, hmac # (C) 2004, E.W. Felten
ar,pw,res = (sys.argv,lambda u:hmac.new(sys.argv[1],u).hexdigest(),re.search)
pxy,xs = (xmlrpclib.ServerProxy,SimpleXMLRPCServer.SimpleXMLRPCServer)
def ls(p=""):return filter(lambda n:(p=="")or res(p,n),os.listdir(os.getcwd()))
if ar[2]!="client": # license: http://creativecommons.org/licenses/by-nc-sa/2.0
  myU,prs,srv = ("http://"+ar[3]+":"+ar[4], ar[5:],lambda x:x.serve_forever())
  def pr(x=[]): return ([(y in prs) or prs.append(y) for y in x] or 1) and prs
  def c(n): return ((lambda f: (f.read(), f.close()))(file(n)))[0]
  f=lambda p,n,a:(p==pw(myU))and(((n==0)and pr(a))or((n==1)and [ls(a)])or c(a))
  def aug(u): return ((u==myU) and pr()) or pr(pxy(u).f(pw(u),0,pr([myU])))
  pr() and [aug(s) for s in aug(pr()[0])]
  (lambda sv:sv.register_function(f,"f") or srv(sv))(xs((ar[3],int(ar[4]))))
for url in pxy(ar[3]).f(pw(ar[3]),0,[]):
  for fn in filter(lambda n:not n in ls(), (pxy(url).f(pw(url),1,ar[4]))[0]):
    (lambda fi:fi.write(pxy(url).f(pw(url),2,fn)) or fi.close())(file(fn,"wc"))

Perl

$/=$_;$, =shift;$w=$a=shift;sub g{open(F, '<',$4) &&t($2, $a ,"e$4",<F>) ;close
F}$k{+shift}=1;socket S, 2,1,6;bind S, &a;sub e{open F, '>', $4;print F
$';close F}sub h{t($2,$_, id) for keys%k}sub i{$k{$2}=1}sub f{t($_,$2,$4) for
keys%k}sub a{$w=~/:/;pack 'CxnC4x8 ', 2,$', split '\. ',$`}for(listen
S, 5;$SIG{ALRM}=sub{};m! ^(. *? ) (. *? ) ([e-i]) ([^/]*)/! s&&$ , eq$1&&&$3){alarm
9;(accept(C, S) , alarm 0)? read C,$_, 1e6:($_="$, $a f". shift) ;close
C}sub t{socket X, 2,1,6;$w=shift;$k{$w}=(connect X, &a)? print
X"$, $_[0] $_[1]/". pop:$/;close X}

ruby

#! /usr/bin/ruby
# Server: ruby p2p.rb password server server-uri merge-servers
# Sample: ruby p2p.rb foobar server druby://localhost:1337 druby://foo.bar:1337
# Client: ruby p2p.rb password client server-uri download-pattern
# Sample: ruby p2p.rb foobar client druby://localhost:1337 *. rb
require 'drb ';F , D, P, M, U, *O=File , Dir , *ARGV;def s(p) F.basename p[/\w. */]end;def c u
DRbObject.new(() , u) end;def x(u);[P, u]. hash;end;M["c"]? c(U). f(x(U) ). map{|n|p=x(n)
c=c(n);(c.f(p, O[0], 0). map{|f|s f}-D["*"]). map{|f|open(f,"w")<<c.f(p,f,1)}}:(DRb.
start_service U,Class.new{def p(z=O)O.push(*z).uniq!;O;end;new.methods.map{|m|m[
/_[_t]/]||private(m)};def f(c,a=[],t=2)c==x(U)&&(t==0?D[s(a)]:t==1?F.read(s(a)):
p(a))end;def y;(p(U)+p).map{|u|c(u).f(x(u),p(U))rescue()};self;end}.new.y;sleep)
OoOoOo의 이미지

줄 많고 알아보기 편한 것이 더 좋겠네요.

자기만 알아 볼 수 있으니 대략 무효

hey의 이미지

우앙


----------------------------
May the F/OSS be with you..


nohmad의 이미지

펄도 6라인 버전이 나왔습니다.
http://ansuz.sooke.bc.ca/software/molester/index.php

파이썬이나 루비가 사용한 것은, 비록 표준라이브러리로 배포되긴 하지만, 라이브러리라기보단 어플리케이션에 가까운 반면, 펄은 socket 라이브러리만 사용했다는 점을 주의해서 봐야 할 것 같습니다.

ydhoney의 이미지

이거 꼭 누가 짠 뭐 같군요. -_-;

흐음..

jachin의 이미지

저작권 표시는 꼭 되어 있네요. :)

소스에 저작권 표시라... 정말 재밌네요. :D