X-Git-Url: http://p2p-next.cs.pub.ro/gitweb/?a=blobdiff_plain;f=src%2Flibswift%2Fswift.h;h=723cf150485739e65d98a7631b38a3314050d2bc;hb=da188550ca4b16d1f49b0e59938ff93612a6cdbb;hp=00275a104ef39a5961c9ad912abb2ecfe2fd3151;hpb=45963a7511531cd1656ad5d3847d2dafd015c54d;p=swifty.git diff --git a/src/libswift/swift.h b/src/libswift/swift.h index 00275a1..723cf15 100644 --- a/src/libswift/swift.h +++ b/src/libswift/swift.h @@ -65,7 +65,7 @@ #include "hashtree.h" #include "avgspeed.h" #include "availability.h" - +#include "../kernel/mptp.h" namespace swift { @@ -86,10 +86,10 @@ namespace swift { /** IPv4 address, just a nice wrapping around struct sockaddr_in. */ struct Address { - struct sockaddr_in addr; + struct sockaddr_mptp *addr; static uint32_t LOCALHOST; void set_port (uint16_t port) { - addr.sin_port = htons(port); + addr->dests[0].port = htons(port); } void set_port (const char* port_str) { int p; @@ -97,17 +97,22 @@ namespace swift { set_port(p); } void set_ipv4 (uint32_t ipv4) { - addr.sin_addr.s_addr = htonl(ipv4); + addr->dests[0].addr = htonl(ipv4); } 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; + addr = (struct sockaddr_mptp *)calloc(1, sizeof(struct sockaddr_mptp) + sizeof(struct mptp_dest)); + addr->count = 1; } Address() { clear(); } + Address(const Address &b) { + clear(); + addr->dests[0].addr = b.addr->dests[0].addr; + addr->dests[0].port = b.addr->dests[0].port; + } Address(const char* ip, uint16_t port) { clear(); set_ipv4(ip); @@ -124,14 +129,29 @@ namespace swift { 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); } - uint16_t port () const { return ntohs(addr.sin_port); } - operator sockaddr_in () const {return addr;} + Address(const struct sockaddr_in& address) { + clear(); + addr->dests[0].addr = address.sin_addr.s_addr; + addr->dests[0].port = address.sin_port; + } + ~Address(){ + free(addr); + } + uint32_t ipv4 () const { return ntohl(addr->dests[0].addr); } + uint16_t port () const { return ntohs(addr->dests[0].port); } + Address& operator = (const Address& b) { + if (this != &b) { + free(addr); + clear(); + addr->dests[0].addr = b.addr->dests[0].addr; + addr->dests[0].port = b.addr->dests[0].port; + } + return *this; + } bool operator == (const Address& b) const { - return addr.sin_family==b.addr.sin_family && - addr.sin_port==b.addr.sin_port && - addr.sin_addr.s_addr==b.addr.sin_addr.s_addr; + return addr->count == b.addr->count && + addr->dests[0].port==b.addr->dests[0].port && + addr->dests[0].addr==b.addr->dests[0].addr; } const char* str () const { // Arno, 2011-10-04: not thread safe, replace. @@ -474,8 +494,8 @@ namespace swift { static void LibeventSendCallback(int fd, short event, void *arg); static void LibeventReceiveCallback(int fd, short event, void *arg); static void RecvDatagram (evutil_socket_t socket); // Called by LibeventReceiveCallback - static int RecvFrom(evutil_socket_t sock, Address& addr, struct evbuffer *evb); // Called by RecvDatagram - static int SendTo(evutil_socket_t sock, const Address& addr, struct evbuffer *evb); // Called by Channel::Send() + static int RecvFrom(evutil_socket_t sock, Address& addr, struct evbuffer **evb); // Called by RecvDatagram + static int SendTo(evutil_socket_t sock, const Address& addr, struct evbuffer **evb); // Called by Channel::Send() static evutil_socket_t Bind(Address address, sckrwecb_t callbacks=sckrwecb_t()); static Address BoundAddress(evutil_socket_t sock); static evutil_socket_t default_socket()