Move functionality into ndn_SocketTransport base class.
diff --git a/ndn-cpp/c/errors.c b/ndn-cpp/c/errors.c
index af32008..cbe2de1 100644
--- a/ndn-cpp/c/errors.c
+++ b/ndn-cpp/c/errors.c
@@ -52,26 +52,18 @@
     return      "unrecognized ndn_KeyLocatorType";
   case NDN_ERROR_decodeBinaryXMLKeyLocator_unrecognized_key_locator_type:
     return      "decodeBinaryXMLKeyLocator unrecognized key locator type";
-  case NDN_ERROR_TcpTransport_error_in_getaddrinfo:
-    return      "TcpTransport error in getaddrinfo";
-  case NDN_ERROR_TcpTransport_cannot_connect_to_socket:
-    return      "TcpTransport cannot connect to socket";
-  case NDN_ERROR_TcpTransport_socket_is_not_open:
-    return      "TcpTransport socket is not open";
-  case NDN_ERROR_TcpTransport_error_in_send:
-    return      "TcpTransport error in send";
-  case NDN_ERROR_TcpTransport_error_in_recv:
-    return      "TcpTransport error in recv";
-  case NDN_ERROR_UdpTransport_error_in_getaddrinfo:
-    return      "UdpTransport error in getaddrinfo";
-  case NDN_ERROR_UdpTransport_cannot_connect_to_socket:
-    return      "UdpTransport cannot connect to socket";
-  case NDN_ERROR_UdpTransport_socket_is_not_open:
-    return      "UdpTransport socket is not open";
-  case NDN_ERROR_UdpTransport_error_in_send:
-    return      "UdpTransport error in send";
-  case NDN_ERROR_UdpTransport_error_in_recv:
-    return      "UdpTransport error in recv";
+  case NDN_ERROR_unrecognized_ndn_SocketTransport:
+    return      "unrecognized ndn_SocketTransport";
+  case NDN_ERROR_SocketTransport_error_in_getaddrinfo:
+    return      "SocketTransport error in getaddrinfo";
+  case NDN_ERROR_SocketTransport_cannot_connect_to_socket:
+    return      "SocketTransport cannot connect to socket";
+  case NDN_ERROR_SocketTransport_socket_is_not_open:
+    return      "SocketTransport socket is not open";
+  case NDN_ERROR_SocketTransport_error_in_send:
+    return      "SocketTransport error in send";
+  case NDN_ERROR_SocketTransport_error_in_recv:
+    return      "SocketTransport error in recv";
   default:
     return "unrecognized ndn_Error code";  
   }
diff --git a/ndn-cpp/c/errors.h b/ndn-cpp/c/errors.h
index f574b6a..6a3daf4 100644
--- a/ndn-cpp/c/errors.h
+++ b/ndn-cpp/c/errors.h
@@ -34,16 +34,12 @@
   NDN_ERROR_unrecognized_ndn_ExcludeType,
   NDN_ERROR_unrecognized_ndn_KeyLocatorType,
   NDN_ERROR_decodeBinaryXMLKeyLocator_unrecognized_key_locator_type,
-  NDN_ERROR_TcpTransport_error_in_getaddrinfo,
-  NDN_ERROR_TcpTransport_cannot_connect_to_socket,
-  NDN_ERROR_TcpTransport_socket_is_not_open,
-  NDN_ERROR_TcpTransport_error_in_send,
-  NDN_ERROR_TcpTransport_error_in_recv,
-  NDN_ERROR_UdpTransport_error_in_getaddrinfo,
-  NDN_ERROR_UdpTransport_cannot_connect_to_socket,
-  NDN_ERROR_UdpTransport_socket_is_not_open,
-  NDN_ERROR_UdpTransport_error_in_send,
-  NDN_ERROR_UdpTransport_error_in_recv
+  NDN_ERROR_unrecognized_ndn_SocketTransport,
+  NDN_ERROR_SocketTransport_error_in_getaddrinfo,
+  NDN_ERROR_SocketTransport_cannot_connect_to_socket,
+  NDN_ERROR_SocketTransport_socket_is_not_open,
+  NDN_ERROR_SocketTransport_error_in_send,
+  NDN_ERROR_SocketTransport_error_in_recv
 } ndn_Error;
   
 /**
diff --git a/ndn-cpp/c/transport/UdpTransport.c b/ndn-cpp/c/transport/SocketTransport.c
similarity index 63%
rename from ndn-cpp/c/transport/UdpTransport.c
rename to ndn-cpp/c/transport/SocketTransport.c
index 0dc5d8e..187f0da 100644
--- a/ndn-cpp/c/transport/UdpTransport.c
+++ b/ndn-cpp/c/transport/SocketTransport.c
@@ -3,7 +3,7 @@
  * See COPYING for copyright and distribution information.
  */
 
-#include "UdpTransport.h"
+#include "SocketTransport.h"
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -15,7 +15,7 @@
 #include <arpa/inet.h>
 #include "../util/ndn_memory.h"
 
-ndn_Error ndn_UdpTransport_connect(struct ndn_UdpTransport *self, char *host, unsigned short port)
+ndn_Error ndn_SocketTransport_connect(struct ndn_SocketTransport *self, ndn_SocketType socketType, char *host, unsigned short port)
 {
   if (self->socketDescriptor >= 0) {
     close(self->socketDescriptor);
@@ -25,14 +25,19 @@
 	struct addrinfo hints;
 	ndn_memset((unsigned char *)&hints, 0, sizeof(hints));
 	hints.ai_family = AF_UNSPEC;
-	hints.ai_socktype = SOCK_DGRAM;
+  if (socketType == SOCKET_TCP)
+    hints.ai_socktype = SOCK_STREAM;
+  else if (socketType == SOCKET_UDP)
+    hints.ai_socktype = SOCK_DGRAM;
+  else
+    return NDN_ERROR_unrecognized_ndn_SocketTransport;
 
   char portString[10];
   sprintf(portString, "%d", port);
   
 	struct addrinfo *serverInfo;
 	if (getaddrinfo(host, portString, &hints, &serverInfo) != 0)
-		return NDN_ERROR_UdpTransport_error_in_getaddrinfo;
+		return NDN_ERROR_SocketTransport_error_in_getaddrinfo;
 
 	// loop through all the results and connect to the first we can
 	struct addrinfo *p;
@@ -51,7 +56,7 @@
 
 	if (p == NULL) {
     freeaddrinfo(serverInfo);
-		return NDN_ERROR_UdpTransport_cannot_connect_to_socket;
+		return NDN_ERROR_SocketTransport_cannot_connect_to_socket;
   }
 
 	freeaddrinfo(serverInfo);
@@ -60,15 +65,15 @@
   return 0;
 }
 
-ndn_Error ndn_UdpTransport_send(struct ndn_UdpTransport *self, unsigned char *data, unsigned int dataLength)
+ndn_Error ndn_SocketTransport_send(struct ndn_SocketTransport *self, unsigned char *data, unsigned int dataLength)
 {
   if (self->socketDescriptor < 0)
-    return NDN_ERROR_UdpTransport_socket_is_not_open;
+    return NDN_ERROR_SocketTransport_socket_is_not_open;
   
   int nBytes;
   while (1) {
     if ((nBytes = send(self->socketDescriptor, data, dataLength, 0)) < 0)
-      return NDN_ERROR_UdpTransport_error_in_send;
+      return NDN_ERROR_SocketTransport_error_in_send;
     if (nBytes >= dataLength)
       break;
     
@@ -79,15 +84,15 @@
   return 0;  
 }
 
-ndn_Error ndn_UdpTransport_receive
-(struct ndn_UdpTransport *self, unsigned char *buffer, unsigned int bufferLength, unsigned int *nBytesOut)
+ndn_Error ndn_SocketTransport_receive
+(struct ndn_SocketTransport *self, unsigned char *buffer, unsigned int bufferLength, unsigned int *nBytesOut)
 {
   if (self->socketDescriptor < 0)
-    return NDN_ERROR_UdpTransport_socket_is_not_open;
+    return NDN_ERROR_SocketTransport_socket_is_not_open;
 
   int nBytes;  
 	if ((nBytes = recv(self->socketDescriptor, buffer, bufferLength, 0)) == -1)
-    return NDN_ERROR_UdpTransport_error_in_recv;
+    return NDN_ERROR_SocketTransport_error_in_recv;
 
   *nBytesOut = (unsigned int)nBytes;
   
diff --git a/ndn-cpp/c/transport/SocketTransport.h b/ndn-cpp/c/transport/SocketTransport.h
new file mode 100644
index 0000000..a5e89f7
--- /dev/null
+++ b/ndn-cpp/c/transport/SocketTransport.h
@@ -0,0 +1,41 @@
+/**
+ * @author: Jeff Thompson
+ * See COPYING for copyright and distribution information.
+ */
+
+#ifndef NDN_SOCKETTRANSPORT_H
+#define	NDN_SOCKETTRANSPORT_H
+
+#include <sys/socket.h>
+#include "../errors.h"
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+typedef enum {
+  SOCKET_TCP,
+  SOCKET_UDP
+} ndn_SocketType;
+  
+struct ndn_SocketTransport {
+  int socketDescriptor; /**< -1 if not connected */
+};
+  
+static inline void ndn_SocketTransport_init(struct ndn_SocketTransport *self)
+{
+  self->socketDescriptor = -1;
+}
+
+ndn_Error ndn_SocketTransport_connect(struct ndn_SocketTransport *self, ndn_SocketType socketType, char *host, unsigned short port);
+
+ndn_Error ndn_SocketTransport_send(struct ndn_SocketTransport *self, unsigned char *data, unsigned int dataLength);
+
+ndn_Error ndn_SocketTransport_receive
+  (struct ndn_SocketTransport *self, unsigned char *buffer, unsigned int bufferLength, unsigned int *nBytes);
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif
diff --git a/ndn-cpp/c/transport/TcpTransport.c b/ndn-cpp/c/transport/TcpTransport.c
deleted file mode 100644
index ea44d86..0000000
--- a/ndn-cpp/c/transport/TcpTransport.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/**
- * @author: Jeff Thompson
- * See COPYING for copyright and distribution information.
- */
-
-#include "TcpTransport.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <netdb.h>
-#include <sys/types.h>
-#include <netinet/in.h>
-#include <sys/socket.h>
-#include <arpa/inet.h>
-#include "../util/ndn_memory.h"
-
-ndn_Error ndn_TcpTransport_connect(struct ndn_TcpTransport *self, char *host, unsigned short port)
-{
-  if (self->socketDescriptor >= 0) {
-    close(self->socketDescriptor);
-    self->socketDescriptor = -1;
-  }
-  
-	struct addrinfo hints;
-	ndn_memset((unsigned char *)&hints, 0, sizeof(hints));
-	hints.ai_family = AF_UNSPEC;
-	hints.ai_socktype = SOCK_STREAM;
-
-  char portString[10];
-  sprintf(portString, "%d", port);
-  
-	struct addrinfo *serverInfo;
-	if (getaddrinfo(host, portString, &hints, &serverInfo) != 0)
-		return NDN_ERROR_TcpTransport_error_in_getaddrinfo;
-
-	// loop through all the results and connect to the first we can
-	struct addrinfo *p;
-  int socketDescriptor;
-	for(p = serverInfo; p != NULL; p = p->ai_next) {
-		if ((socketDescriptor = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1)
-			continue;
-
-		if (connect(socketDescriptor, p->ai_addr, p->ai_addrlen) == -1) {
-			close(socketDescriptor);
-			continue;
-		}
-
-		break;
-	}
-
-	if (p == NULL) {
-    freeaddrinfo(serverInfo);
-		return NDN_ERROR_TcpTransport_cannot_connect_to_socket;
-  }
-
-	freeaddrinfo(serverInfo);
-  self->socketDescriptor = socketDescriptor;
-
-  return 0;
-}
-
-ndn_Error ndn_TcpTransport_send(struct ndn_TcpTransport *self, unsigned char *data, unsigned int dataLength)
-{
-  if (self->socketDescriptor < 0)
-    return NDN_ERROR_TcpTransport_socket_is_not_open;
-  
-  int nBytes;
-  while (1) {
-    if ((nBytes = send(self->socketDescriptor, data, dataLength, 0)) < 0)
-      return NDN_ERROR_TcpTransport_error_in_send;
-    if (nBytes >= dataLength)
-      break;
-    
-    // Send more.
-    dataLength -= nBytes;
-  }
-
-  return 0;  
-}
-
-ndn_Error ndn_TcpTransport_receive
-(struct ndn_TcpTransport *self, unsigned char *buffer, unsigned int bufferLength, unsigned int *nBytesOut)
-{
-  if (self->socketDescriptor < 0)
-    return NDN_ERROR_TcpTransport_socket_is_not_open;
-
-  int nBytes;  
-	if ((nBytes = recv(self->socketDescriptor, buffer, bufferLength, 0)) == -1)
-    return NDN_ERROR_TcpTransport_error_in_recv;
-
-  *nBytesOut = (unsigned int)nBytes;
-  
-	return 0;  
-}
diff --git a/ndn-cpp/c/transport/TcpTransport.h b/ndn-cpp/c/transport/TcpTransport.h
index 0a1742c..ec43806 100644
--- a/ndn-cpp/c/transport/TcpTransport.h
+++ b/ndn-cpp/c/transport/TcpTransport.h
@@ -8,27 +8,36 @@
 #ifndef NDN_TCPTRANSPORT_H
 #define	NDN_TCPTRANSPORT_H
 
-#include "../errors.h"
+#include "SocketTransport.h"
 
 #ifdef	__cplusplus
 extern "C" {
 #endif
 
 struct ndn_TcpTransport {
-  int socketDescriptor; /**< -1 if not connected */
+  struct ndn_SocketTransport base;
 };
   
 static inline void ndn_TcpTransport_init(struct ndn_TcpTransport *self)
 {
-  self->socketDescriptor = -1;
+  ndn_SocketTransport_init(&self->base);
 }
 
-ndn_Error ndn_TcpTransport_connect(struct ndn_TcpTransport *self, char *host, unsigned short port);
+static inline ndn_Error ndn_TcpTransport_connect(struct ndn_TcpTransport *self, char *host, unsigned short port)
+{
+  return ndn_SocketTransport_connect(&self->base, SOCKET_TCP, host, port);
+}
 
-ndn_Error ndn_TcpTransport_send(struct ndn_TcpTransport *self, unsigned char *data, unsigned int dataLength);
+static inline ndn_Error ndn_TcpTransport_send(struct ndn_TcpTransport *self, unsigned char *data, unsigned int dataLength)
+{
+  return ndn_SocketTransport_send(&self->base, data, dataLength);
+}
 
-ndn_Error ndn_TcpTransport_receive
-  (struct ndn_TcpTransport *self, unsigned char *buffer, unsigned int bufferLength, unsigned int *nBytes);
+static inline ndn_Error ndn_TcpTransport_receive
+  (struct ndn_TcpTransport *self, unsigned char *buffer, unsigned int bufferLength, unsigned int *nBytes)
+{
+  return ndn_SocketTransport_receive(&self->base, buffer, bufferLength, nBytes);
+}
 
 #ifdef	__cplusplus
 }
diff --git a/ndn-cpp/c/transport/UdpTransport.h b/ndn-cpp/c/transport/UdpTransport.h
index 924e4a7..262d5ec 100644
--- a/ndn-cpp/c/transport/UdpTransport.h
+++ b/ndn-cpp/c/transport/UdpTransport.h
@@ -1,32 +1,43 @@
-/**
- * @author: Jeff Thompson
- * See COPYING for copyright and distribution information.
+/* 
+ * File:   UdpTransport.h
+ * Author: jefft0
+ *
+ * Created on July 14, 2013, 4:15 PM
  */
 
 #ifndef NDN_UDPTRANSPORT_H
 #define	NDN_UDPTRANSPORT_H
 
-#include "../errors.h"
+#include "SocketTransport.h"
 
 #ifdef	__cplusplus
 extern "C" {
 #endif
 
 struct ndn_UdpTransport {
-  int socketDescriptor; /**< -1 if not connected */
+  struct ndn_SocketTransport base;
 };
   
 static inline void ndn_UdpTransport_init(struct ndn_UdpTransport *self)
 {
-  self->socketDescriptor = -1;
+  ndn_SocketTransport_init(&self->base);
 }
 
-ndn_Error ndn_UdpTransport_connect(struct ndn_UdpTransport *self, char *host, unsigned short port);
+static inline ndn_Error ndn_UdpTransport_connect(struct ndn_UdpTransport *self, char *host, unsigned short port)
+{
+  return ndn_SocketTransport_connect(&self->base, SOCKET_UDP, host, port);
+}
 
-ndn_Error ndn_UdpTransport_send(struct ndn_UdpTransport *self, unsigned char *data, unsigned int dataLength);
+static inline ndn_Error ndn_UdpTransport_send(struct ndn_UdpTransport *self, unsigned char *data, unsigned int dataLength)
+{
+  return ndn_SocketTransport_send(&self->base, data, dataLength);
+}
 
-ndn_Error ndn_UdpTransport_receive
-  (struct ndn_UdpTransport *self, unsigned char *buffer, unsigned int bufferLength, unsigned int *nBytes);
+static inline ndn_Error ndn_UdpTransport_receive
+  (struct ndn_UdpTransport *self, unsigned char *buffer, unsigned int bufferLength, unsigned int *nBytes)
+{
+  return ndn_SocketTransport_receive(&self->base, buffer, bufferLength, nBytes);
+}
 
 #ifdef	__cplusplus
 }