5 * Created by Victor Grishchenko, Arno Bakker on 3/9/09.
6 * Copyright 2009 Delft University of Technology. All rights reserved.
13 #include "compat/stdint.h"
23 #include <arpa/inet.h>
24 #include <sys/select.h>
25 #include <sys/socket.h>
26 #include <netinet/in.h>
36 #include "compat/util.h"
42 #define MAXDGRAMSZ 2800
44 #define INVALID_SOCKET -1
49 struct sockaddr_in addr;
50 static uint32_t LOCALHOST;
51 void set_port (uint16_t port) {
52 addr.sin_port = htons(port);
54 void set_port (const char* port_str) {
56 if (sscanf(port_str,"%i",&p))
59 void set_ipv4 (uint32_t ipv4) {
60 addr.sin_addr.s_addr = htonl(ipv4);
62 void set_ipv4 (const char* ipv4_str) ;
63 //{ inet_aton(ipv4_str,&(addr.sin_addr)); }
65 memset(&addr,0,sizeof(struct sockaddr_in));
66 addr.sin_family = AF_INET;
71 Address(const char* ip, uint16_t port) {
76 Address(const char* ip_port);
77 Address(uint16_t port) {
82 Address(uint32_t ipv4addr, uint16_t port) {
87 Address(const struct sockaddr_in& address) : addr(address) {}
88 uint32_t ipv4 () const { return ntohl(addr.sin_addr.s_addr); }
89 uint16_t port () const { return ntohs(addr.sin_port); }
90 operator sockaddr_in () const {return addr;}
91 bool operator == (const Address& b) const {
92 return addr.sin_family==b.addr.sin_family &&
93 addr.sin_port==b.addr.sin_port &&
94 addr.sin_addr.s_addr==b.addr.sin_addr.s_addr;
96 const char* str () const {
97 static char rs[4][32];
100 sprintf(rs[i],"%i.%i.%i.%i:%i",ipv4()>>24,(ipv4()>>16)&0xff,
101 (ipv4()>>8)&0xff,ipv4()&0xff,port());
104 bool operator != (const Address& b) const { return !(*this==b); }
113 uint8_t buf[MAXDGRAMSZ*2];
115 static SOCKET Bind(Address address);
116 static void Close(int port);
118 static SOCKET Wait (int sockcnt, SOCKET* sockets, tint usec=0);
119 static tint now, epoch, start;
120 static uint64_t dgrams_up, dgrams_down, bytes_up, bytes_down;
122 Datagram (SOCKET socket, const Address addr_) : addr(addr_), offset(0),
123 length(0), sock(socket) {}
124 Datagram (SOCKET socket) : offset(0), length(0), sock(socket) {
127 int space () const { return MAXDGRAMSZ-length; }
128 int size() const { return length-offset; }
129 std::string str() const { return std::string((char*)buf+offset,size()); }
130 const uint8_t* operator * () const { return buf+offset; }
132 int Push (const uint8_t* data, int l) { // scatter-gather one day
133 int toc = l<space() ? l : space();
134 memcpy(buf+length,data,toc);
138 int Pull (uint8_t** data, int l) {
139 int toc = l<size() ? l : size();
140 //memcpy(data,buf+offset,toc);
148 const Address& address() const { return addr; }
149 void Clear() { offset=length=0; }
151 void PushString (std::string str) {
152 Push((uint8_t*)str.c_str(),str.size());
154 void Push8 (uint8_t b) {
157 void Push16 (uint16_t w) {
158 *(uint16_t*)(buf+length) = htons(w);
161 void Push32 (uint32_t i) {
162 *(uint32_t*)(buf+length) = htonl(i);
165 void Push64 (uint64_t l) {
166 *(uint32_t*)(buf+length) = htonl((uint32_t)(l>>32));
167 *(uint32_t*)(buf+length+4) = htonl((uint32_t)(l&0xffffffff));
170 void PushHash (const Sha1Hash& hash) {
171 Push((uint8_t*)hash.bits, Sha1Hash::SIZE);
175 if (size()<1) return 0;
176 return buf[offset++];
179 if (size()<2) return 0;
181 return ntohs(*(uint16_t*)(buf+offset-2));
184 if (size()<4) return 0;
185 uint32_t i = ntohl(*(uint32_t*)(buf+offset));
190 if (size()<8) return 0;
191 uint64_t l = ntohl(*(uint32_t*)(buf+offset));
193 l |= ntohl(*(uint32_t*)(buf+offset+4));
197 Sha1Hash PullHash() {
198 if (size()<Sha1Hash::SIZE) return Sha1Hash::ZERO;
199 offset += Sha1Hash::SIZE;
200 return Sha1Hash(false,(char*)buf+offset-Sha1Hash::SIZE);
202 //std::string to_string () const ;
206 const char* tintstr(tint t=0);
207 std::string sock2str (struct sockaddr_in addr);
209 #define dprintf(...) printf(__VA_ARGS__)
211 #define dprintf(...) {}
213 #define eprintf(...) fprintf(stderr,__VA_ARGS__)
214 //#define dprintf(...) {}