the Address inner class
authorvictor <victor@e16421f0-f15b-0410-abcd-98678b794739>
Sun, 18 Oct 2009 13:28:28 +0000 (13:28 +0000)
committervictor <victor@e16421f0-f15b-0410-abcd-98678b794739>
Sun, 18 Oct 2009 13:28:28 +0000 (13:28 +0000)
git-svn-id: https://ttuki.vtt.fi/svn/p2p-next/TUD/p2tp/trunk@437 e16421f0-f15b-0410-abcd-98678b794739

datagram.cpp
datagram.h
tests/dgramtest.cpp

index a81622d..a745d63 100644 (file)
@@ -114,7 +114,7 @@ std::string sock2str (struct sockaddr_in addr) {
        return std::string(ipch);
 }
 
-
+/*
 std::string Datagram::to_string () const { // TODO: pretty-print P2TP
        std::string addrs = sock2str(addr);
        char hex[MAXDGRAMSZ*2];
@@ -122,6 +122,6 @@ std::string Datagram::to_string () const { // TODO: pretty-print P2TP
                sprintf(hex+i*2,"%02x",buf[i]);
        std::string hexs(hex+offset*2,(length-offset)*2);
        return addrs + '\t' + hexs;
-}
+}*/
 
 }
index dd2f5dd..2b81140 100644 (file)
@@ -16,6 +16,7 @@
 #include <sys/socket.h>
 #include <sys/time.h>
 #include <netinet/in.h>
+#include <arpa/inet.h>
 //#include <sys/mman.h>
 #include <string.h>
 #include <unistd.h>
@@ -31,28 +32,50 @@ typedef int64_t tint;
 #define TINT_uSEC ((tint)1)
 #define TINT_NEVER ((tint)0x7fffffffffffffffLL)
 #define MAXDGRAMSZ 1400
-
+#define INVALID_SOCKET -1
+    
+    
 struct Datagram {
-       struct sockaddr_in addr;
+       
+    struct Address {
+        struct sockaddr_in  addr;
+        Address() {
+            memset(&addr,0,sizeof(struct sockaddr_in)); 
+        }
+        Address(const char* ip, uint16_t port) {
+            addr.sin_family = AF_INET;
+            addr.sin_port = htons(port);
+            inet_aton(ip,&(addr.sin_addr));
+        }
+        Address(uint16_t port) {
+            addr.sin_family = AF_INET;
+            addr.sin_port = htons(port);
+            addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+        }
+        Address(const struct sockaddr_in& address) : addr(address) {}
+        operator sockaddr_in () {return addr;}
+    };
+    
+       Address addr;
        int sock;
        int offset, length;
-       uint8_t buf[MAXDGRAMSZ];
-       
+       uint8_t buf[MAXDGRAMSZ*2];
+    
        static int Bind(int port);
        static void Close(int port);
        static tint Time();
        static int Wait (int sockcnt, int* sockets, tint usec=0);
        static tint now;
        
-       Datagram (int socket, struct sockaddr_in& addr_) : addr(addr_), offset(0), 
+       Datagram (int socket, const Address addr_) : addr(addr_), offset(0), 
                length(0), sock(socket) {}
        Datagram (int socket) : offset(0), length(0), sock(socket) { 
-               memset(&addr,0,sizeof(struct sockaddr_in)); 
        }
        
        int space () const { return MAXDGRAMSZ-length; }
        int size() const { return length-offset; }
        std::string str() const { return std::string((char*)buf+offset,size()); }
+    const uint8_t* operator * () const { return buf+offset; }
        
        int Push (const uint8_t* data, int l) { // scatter-gather one day
                int toc = l<space() ? l : space();
@@ -70,7 +93,7 @@ struct Datagram {
        
        int Send ();
        int Recv ();
-       const struct sockaddr_in& address() const { return addr; }
+       const Address& address() const { return addr; }
     void Clear() { offset=length=0; }
 
        void    PushString (std::string str) {
@@ -124,7 +147,7 @@ struct Datagram {
                offset += Sha1Hash::SIZE;
                return Sha1Hash(false,(char*)buf+offset-Sha1Hash::SIZE);
        }
-       std::string     to_string () const ;
+       //std::string   to_string () const ;
        
 };
 
index 3e27baa..395e85d 100644 (file)
@@ -20,7 +20,7 @@ TEST(Datagram, BinaryTest) {
        addr.sin_family = AF_INET;
        addr.sin_port = htons(7001);
        addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
-       Datagram d(socket,addr);
+       Datagram d(socket,addr); //Datagram::Address(7001));
        const char * text = "text";
        const uint8_t num8 = 0xab;
        const uint16_t num16 = 0xabcd;
@@ -64,15 +64,15 @@ TEST(Datagram,TwoPortTest) {
        int sock2 = Datagram::Bind(10002);
        ASSERT_TRUE(sock1>0);
        ASSERT_TRUE(sock2>0);
-       struct sockaddr_in addr1, addr2;
+       /*struct sockaddr_in addr1, addr2;
        addr1.sin_family = AF_INET;
        addr1.sin_port = htons(10001);
        addr1.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
        addr2.sin_family = AF_INET;
        addr2.sin_port = htons(10002);
-       addr2.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+       addr2.sin_addr.s_addr = htonl(INADDR_LOOPBACK);*/
        
-       Datagram send(sock1,addr2);
+       Datagram send(sock1,Datagram::Address(10002));
        send.Push32(1234);
        send.Send();