--- /dev/null
+#ifdef WIN32
+#include <winsock2.h>
+#else
+#include <netinet/in.h>
+#endif
+#include <msp/strings/format.h>
+#include "inet.h"
+#include "sockaddr_private.h"
+
+using namespace std;
+
+namespace Msp {
+namespace Net {
+
+InetAddr::InetAddr():
+ port(0)
+{
+ fill(addr, addr+4, 0);
+}
+
+InetAddr::InetAddr(const SysAddr &sa)
+{
+ const sockaddr_in &sai = reinterpret_cast<const sockaddr_in &>(sa.addr);
+ addr[0] = sai.sin_addr.s_addr>>24;
+ addr[1] = sai.sin_addr.s_addr>>16;
+ addr[2] = sai.sin_addr.s_addr>>8;
+ addr[3] = sai.sin_addr.s_addr;
+ port = ntohs(sai.sin_port);
+}
+
+SockAddr::SysAddr InetAddr::to_sys() const
+{
+ SysAddr sa;
+ sa.size = sizeof(sockaddr_in);
+ sockaddr_in &sai = reinterpret_cast<sockaddr_in &>(sa.addr);
+ sai.sin_family = AF_INET;
+ sai.sin_addr.s_addr = (addr[0]<<24) | (addr[1]<<16) | (addr[2]<<8) | (addr[3]);
+ sai.sin_port = htons(port);
+
+ return sa;
+}
+
+string InetAddr::str() const
+{
+ string result = format("%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]);
+ if(port)
+ result += format(":%d", port);
+ return result;
+}
+
+} // namespace Net
+} // namespace Msp