Added Transport close method
diff --git a/ndn-cpp/c/errors.c b/ndn-cpp/c/errors.c
index f6dcfec..a5b0510 100644
--- a/ndn-cpp/c/errors.c
+++ b/ndn-cpp/c/errors.c
@@ -64,6 +64,8 @@
     return      "SocketTransport error in send";
   case NDN_ERROR_SocketTransport_error_in_recv:
     return      "SocketTransport error in recv";
+  case NDN_ERROR_SocketTransport_error_in_close:
+    return      "SocketTransport error in close";
   default:
     return "unrecognized ndn_Error code";  
   }
diff --git a/ndn-cpp/c/errors.h b/ndn-cpp/c/errors.h
index f8564d8..7400bf1 100644
--- a/ndn-cpp/c/errors.h
+++ b/ndn-cpp/c/errors.h
@@ -39,7 +39,8 @@
   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_SocketTransport_error_in_recv,
+  NDN_ERROR_SocketTransport_error_in_close
 } ndn_Error;
   
 /**
diff --git a/ndn-cpp/c/transport/SocketTransport.c b/ndn-cpp/c/transport/SocketTransport.c
index 187f0da..ee1f72a 100644
--- a/ndn-cpp/c/transport/SocketTransport.c
+++ b/ndn-cpp/c/transport/SocketTransport.c
@@ -98,3 +98,17 @@
   
 	return 0;  
 }
+
+ndn_Error ndn_SocketTransport_close(struct ndn_SocketTransport *self)
+{
+  if (self->socketDescriptor < 0)
+    // Already closed.  Do nothing.
+    return 0;
+  
+  if (close(self->socketDescriptor) != 0)
+    return NDN_ERROR_SocketTransport_error_in_close;
+  
+  self->socketDescriptor = -1;
+  
+  return 0;
+}
diff --git a/ndn-cpp/c/transport/SocketTransport.h b/ndn-cpp/c/transport/SocketTransport.h
index a5e89f7..6973d19 100644
--- a/ndn-cpp/c/transport/SocketTransport.h
+++ b/ndn-cpp/c/transport/SocketTransport.h
@@ -34,6 +34,8 @@
 ndn_Error ndn_SocketTransport_receive
   (struct ndn_SocketTransport *self, unsigned char *buffer, unsigned int bufferLength, unsigned int *nBytes);
 
+ndn_Error ndn_SocketTransport_close(struct ndn_SocketTransport *self);
+
 #ifdef	__cplusplus
 }
 #endif
diff --git a/ndn-cpp/c/transport/TcpTransport.h b/ndn-cpp/c/transport/TcpTransport.h
index ec43806..6421d4b 100644
--- a/ndn-cpp/c/transport/TcpTransport.h
+++ b/ndn-cpp/c/transport/TcpTransport.h
@@ -39,6 +39,11 @@
   return ndn_SocketTransport_receive(&self->base, buffer, bufferLength, nBytes);
 }
 
+static inline ndn_Error ndn_TcpTransport_close(struct ndn_TcpTransport *self)
+{
+  return ndn_SocketTransport_close(&self->base);
+}
+
 #ifdef	__cplusplus
 }
 #endif
diff --git a/ndn-cpp/c/transport/UdpTransport.h b/ndn-cpp/c/transport/UdpTransport.h
index 262d5ec..ef113b2 100644
--- a/ndn-cpp/c/transport/UdpTransport.h
+++ b/ndn-cpp/c/transport/UdpTransport.h
@@ -39,6 +39,11 @@
   return ndn_SocketTransport_receive(&self->base, buffer, bufferLength, nBytes);
 }
 
+static inline ndn_Error ndn_UdpTransport_close(struct ndn_UdpTransport *self)
+{
+  return ndn_SocketTransport_close(&self->base);
+}
+
 #ifdef	__cplusplus
 }
 #endif
diff --git a/ndn-cpp/transport/TcpTransport.cpp b/ndn-cpp/transport/TcpTransport.cpp
index a6a6663..bf5180a 100644
--- a/ndn-cpp/transport/TcpTransport.cpp
+++ b/ndn-cpp/transport/TcpTransport.cpp
@@ -51,4 +51,11 @@
   }
 }
 
+void TcpTransport::close()
+{
+  ndn_Error error;
+  if (error = ndn_TcpTransport_close(&transport_))
+    throw std::runtime_error(ndn_getErrorString(error));  
+}
+
 }
diff --git a/ndn-cpp/transport/TcpTransport.hpp b/ndn-cpp/transport/TcpTransport.hpp
index 88e61fb..da8b103 100644
--- a/ndn-cpp/transport/TcpTransport.hpp
+++ b/ndn-cpp/transport/TcpTransport.hpp
@@ -29,6 +29,8 @@
   virtual void send(const unsigned char *data, unsigned int dataLength);
 
   virtual void tempReceive();
+
+  virtual void close();
   
 private:
   struct ndn_TcpTransport transport_;
diff --git a/ndn-cpp/transport/Transport.cpp b/ndn-cpp/transport/Transport.cpp
index e0aab03..1e63649 100644
--- a/ndn-cpp/transport/Transport.cpp
+++ b/ndn-cpp/transport/Transport.cpp
@@ -19,5 +19,9 @@
 {
   throw logic_error("unimplemented");
 }
+ 
+void Transport::close()
+{
+}
 
 }
diff --git a/ndn-cpp/transport/Transport.hpp b/ndn-cpp/transport/Transport.hpp
index af1a2c0..dedfffd 100644
--- a/ndn-cpp/transport/Transport.hpp
+++ b/ndn-cpp/transport/Transport.hpp
@@ -25,6 +25,11 @@
   {
     send(&data[0], data.size());
   }
+  
+  /**
+   * Close the connection.  This base class implementation does nothing, but your derived class can override.
+   */
+  virtual void close();
 };
 
 }
diff --git a/ndn-cpp/transport/UdpTransport.cpp b/ndn-cpp/transport/UdpTransport.cpp
index 52b62a5..5fc4a71 100644
--- a/ndn-cpp/transport/UdpTransport.cpp
+++ b/ndn-cpp/transport/UdpTransport.cpp
@@ -51,4 +51,11 @@
   }
 }
 
+void UdpTransport::close()
+{
+  ndn_Error error;
+  if (error = ndn_UdpTransport_close(&transport_))
+    throw std::runtime_error(ndn_getErrorString(error));  
+}
+
 }
diff --git a/ndn-cpp/transport/UdpTransport.hpp b/ndn-cpp/transport/UdpTransport.hpp
index 781effd..9043e5c 100644
--- a/ndn-cpp/transport/UdpTransport.hpp
+++ b/ndn-cpp/transport/UdpTransport.hpp
@@ -30,6 +30,8 @@
 
   virtual void tempReceive();
   
+  virtual void close();
+
 private:
   struct ndn_UdpTransport transport_;
   Face *face_;