DNS lookups
authorvictor <victor@e16421f0-f15b-0410-abcd-98678b794739>
Tue, 17 Nov 2009 18:33:55 +0000 (18:33 +0000)
committervictor <victor@e16421f0-f15b-0410-abcd-98678b794739>
Tue, 17 Nov 2009 18:33:55 +0000 (18:33 +0000)
git-svn-id: https://ttuki.vtt.fi/svn/p2p-next/TUD/p2tp/trunk@575 e16421f0-f15b-0410-abcd-98678b794739

datagram.cpp
datagram.h
tests/dgramtest.cpp

index d549134..bcb4fe5 100644 (file)
@@ -14,6 +14,7 @@
 #else
     #include <arpa/inet.h>
 #endif
+#include <netdb.h>
 #include "datagram.h"
 #include "compat.h"
 
@@ -48,6 +49,16 @@ const char* tintstr (tint time) {
     return ret_str[i];
 }
     
+void Address::set_ipv4 (const char* ip_str) {
+    struct hostent *h = gethostbyname(ip_str);
+    if (h == NULL) {
+       print_error("cannot lookup address");
+       return;
+    } else {
+        addr.sin_addr.s_addr = *(u_long *) h->h_addr_list[0];
+    }
+}
+    
     
 Address::Address(const char* ip_port) {
     clear();
@@ -137,7 +148,7 @@ tint Datagram::Time () {
 SOCKET Datagram::Bind (Address addr_) {
     struct sockaddr_in addr = addr_;
        SOCKET fd;
-       int len = sizeof(struct sockaddr_in), sndbuf=1<<20, rcvbuf=1<<20;
+       int len = sizeof(struct sockaddr_in), sndbuf=1<<20, rcvbuf=1<<20, enable=1;
        if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
                print_error("socket() fails");
         return INVALID_SOCKET;
@@ -153,6 +164,7 @@ SOCKET Datagram::Bind (Address addr_) {
         print_error("setsockopt2 fails");
         return INVALID_SOCKET;
     }
+    setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&enable, sizeof(int));
 #else
        if (fcntl(fd, F_SETFL, O_NONBLOCK) == -1)
                return INVALID_SOCKET;
@@ -164,6 +176,7 @@ SOCKET Datagram::Bind (Address addr_) {
         print_error("setsockopt2 fails");
         return INVALID_SOCKET;
     }
+    setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(int));
 #endif
     dprintf("socket buffers: %i send %i recv\n",sndbuf,rcvbuf);
        if (::bind(fd, (sockaddr*)&addr, len) != 0) {
index 2293ea7..db7c9f7 100644 (file)
@@ -59,9 +59,8 @@ struct Address {
     void set_ipv4 (uint32_t ipv4) {
         addr.sin_addr.s_addr = htonl(ipv4);
     }
-    void set_ipv4 (const char* ipv4_str) {
-        inet_aton(ipv4_str,&(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;
index 24822a0..dea04c0 100644 (file)
 
 using namespace p2tp;
 
+TEST(Datagram, AddressTest) {
+    Address addr("127.0.0.1:1000");
+    EXPECT_EQ(INADDR_LOOPBACK,addr.ipv4());
+    EXPECT_EQ(1000,addr.port());
+}
+
 
 TEST(Datagram, BinaryTest) {
        SOCKET socket = Datagram::Bind(7001);