From 0fecc42b5d87ad141a3a428724a547c9ee80fc9a Mon Sep 17 00:00:00 2001 From: victor Date: Fri, 6 Nov 2009 15:35:51 +0000 Subject: [PATCH] seeder/leecher OK git-svn-id: https://ttuki.vtt.fi/svn/p2p-next/TUD/p2tp/trunk@505 e16421f0-f15b-0410-abcd-98678b794739 --- datagram.cpp | 24 ++++++++++++++++++++++++ datagram.h | 48 ++++++++++++++++++++++++++++-------------------- exec/leecher.cpp | 6 +++++- exec/seeder.cpp | 12 ++++++++---- p2tp.cpp | 7 ++++++- p2tp.h | 2 ++ sendrecv.cpp | 1 + 7 files changed, 74 insertions(+), 26 deletions(-) diff --git a/datagram.cpp b/datagram.cpp index 333a14c..0c60113 100644 --- a/datagram.cpp +++ b/datagram.cpp @@ -46,6 +46,30 @@ const char* tintstr (tint time) { return ret_str[i]; } + +Address::Address(const char* ip_port) { + clear(); + if (strlen(ip_port)>=32) + return; + char ipp[32]; + strncpy(ipp,ip_port,32); + char* semi = strchr(ipp,':'); + if (semi) { + *semi = 0; + set_ipv4(ipp); + set_port(semi+1); + } else { + if (strchr(ipp, '.')) { + set_ipv4(ipp); + set_port((uint16_t)0); + } else { + set_ipv4(INADDR_LOOPBACK); + set_port(ipp); + } + } +} + + int Datagram::Send () { int r = sendto(sock,(const char *)buf+offset,length-offset,0, (struct sockaddr*)&(addr.addr),sizeof(struct sockaddr_in)); diff --git a/datagram.h b/datagram.h index cbbdc4f..5d8ba05 100644 --- a/datagram.h +++ b/datagram.h @@ -51,34 +51,42 @@ typedef int64_t tint; struct Address { struct sockaddr_in addr; static uint32_t LOCALHOST; - void init(uint32_t ipv4=0, uint16_t port=0) { - memset(&addr,0,sizeof(struct sockaddr_in)); - addr.sin_family = AF_INET; + void set_port (uint16_t port) { addr.sin_port = htons(port); + } + void set_port (const char* port_str) { + int p; + if (sscanf(port_str,"%i",&p)) + set_port(p); + } + void set_ipv4 (uint32_t ipv4) { addr.sin_addr.s_addr = htonl(ipv4); } - Address() { init(); } - Address(const char* ip, uint16_t port) { - init(LOCALHOST,port); - inet_aton(ip,&(addr.sin_addr)); + void set_ipv4 (const char* ipv4_str) { + inet_aton(ipv4_str,&(addr.sin_addr)); + } + void clear () { + memset(&addr,0,sizeof(struct sockaddr_in)); + addr.sin_family = AF_INET; + } + Address() { + clear(); } - Address(const char* ip_port) { - char ipp[32]; - strcpy(ipp,ip_port); - char* semi = strchr(ipp,':'); - if (semi) { - *semi = 0; - int port; - sscanf(semi+1, "%i", &port); - init(LOCALHOST,port); - } - inet_aton(ipp,&(addr.sin_addr)); + Address(const char* ip, uint16_t port) { + clear(); + set_ipv4(ip); + set_port(port); } + Address(const char* ip_port); Address(uint16_t port) { - init(LOCALHOST,port); + clear(); + set_ipv4(LOCALHOST); + set_port(port); } Address(uint32_t ipv4addr, uint16_t port) { - init(ipv4addr,port); + clear(); + set_ipv4(ipv4addr); + set_port(port); } Address(const struct sockaddr_in& address) : addr(address) {} uint32_t ipv4 () const { return ntohl(addr.sin_addr.s_addr); } diff --git a/exec/leecher.cpp b/exec/leecher.cpp index abd05da..cee17e4 100644 --- a/exec/leecher.cpp +++ b/exec/leecher.cpp @@ -15,6 +15,9 @@ using namespace p2tp; /** P2TP downloader. Params: root hash, filename, tracker ip/port, own ip/port */ int main (int argn, char** args) { + srand(time(NULL)); + FileTransfer::instance = rand(); + if (argn<4) { fprintf(stderr,"parameters: root_hash filename tracker_ip/port [own_ip/port]\n"); return -1; @@ -41,9 +44,10 @@ int main (int argn, char** args) { p2tp::SetTracker(tracker); int file = p2tp::Open(filename,root_hash); + printf("Downloading %s\n",root_hash.hex().c_str()); while (!p2tp::Complete(file)) { - p2tp::Loop(TINT_SEC/100); + p2tp::Loop(TINT_SEC); printf("%lli dgram %lli bytes up, %lli dgram %lli bytes down\n", Datagram::dgrams_up, Datagram::bytes_up, Datagram::dgrams_down, Datagram::bytes_down ); diff --git a/exec/seeder.cpp b/exec/seeder.cpp index 59ef6ab..39397ee 100644 --- a/exec/seeder.cpp +++ b/exec/seeder.cpp @@ -22,7 +22,11 @@ int main (int argn, char** args) { char* filename = args[1]; - Address tracker(args[3]), bindaddr(args[2]); + if (argn>=4) { + Address tracker(args[3]); + p2tp::SetTracker(tracker); + } + Address bindaddr(args[2]); if (bindaddr==Address()) { fprintf(stderr,"Bind address format: [1.2.3.4:]12345\n"); @@ -30,14 +34,14 @@ int main (int argn, char** args) { } assert(0root_hash(); +} /**

P2TP handshake

diff --git a/p2tp.h b/p2tp.h index 69ea5f3..2e8c8e7 100644 --- a/p2tp.h +++ b/p2tp.h @@ -368,6 +368,8 @@ namespace p2tp { /** Open a file, start a transmission; fill it with content for a given root hash; in case the hash is omitted, the file is a fresh submit. */ int Open (const char* filename, const Sha1Hash& hash=Sha1Hash::ZERO) ; + /** Get the root hash for the transmission. */ + const Sha1Hash& RootMerkleHash (int file) ; /** Close a file and a transmission. */ void Close (int fd) ; /** Add a possible peer which participares in a given transmission. In the case diff --git a/sendrecv.cpp b/sendrecv.cpp index b4f95ec..a01d853 100644 --- a/sendrecv.cpp +++ b/sendrecv.cpp @@ -420,6 +420,7 @@ void Channel::Recv (int socket) { RETLOG ("invalid peer address"); channel->own_id_mentioned_ = true; } + dprintf("recvd %i bytes for %i\n",data.size(),channel->id); channel->Recv(data); } -- 2.20.1