diff --git a/src/lua/bsdsocket.lua b/src/lua/bsdsocket.lua
index 1eb2dea73a3d147a4413f62e3c54277d90a71a22..7795d8d93355cc3fe47d6c8a7e00b3416d210834 100644
--- a/src/lua/bsdsocket.lua
+++ b/src/lua/bsdsocket.lua
@@ -852,6 +852,22 @@ local function getaddrinfo(host, port, timeout, opts)
     return internal.getaddrinfo(host, port, timeout, ga_opts)
 end
 
+local soname_mt = {
+    __tostring = function(si)
+        if si.host == nil and si.port == nil then
+            return ''
+        end
+        if si.host == nil then
+            return sprintf('%s:%s', '0', tostring(si.port))
+        end
+
+        if si.port == nil then
+            return sprintf('%s:%', tostring(si.host), 0)
+        end
+        return sprintf('%s:%s', tostring(si.host), tostring(si.port))
+    end
+}
+
 socket_methods.name = function(self)
     local aka = internal.name(self.fh)
     if aka == nil then
@@ -859,6 +875,7 @@ socket_methods.name = function(self)
         return nil
     end
     self._errno = nil
+    setmetatable(aka, soname_mt)
     return aka
 end
 
@@ -869,6 +886,7 @@ socket_methods.peer = function(self)
         return nil
     end
     self._errno = nil
+    setmetatable(peer, soname_mt)
     return peer
 end
 
diff --git a/test/box/bsdsocket.result b/test/box/bsdsocket.result
index c7a2cc98be12aab92a5156a3962b463a8a7894d1..2bd743400646fa1f37113ac80c07234452c8be02 100644
--- a/test/box/bsdsocket.result
+++ b/test/box/bsdsocket.result
@@ -642,6 +642,14 @@ json.encode(sc:name())
 ---
 - '{"host":"0.0.0.0","family":"AF_INET","type":"SOCK_STREAM","protocol":"tcp","port":0}'
 ...
+sc:name()
+---
+- host: 0.0.0.0
+  family: AF_INET
+  type: SOCK_STREAM
+  protocol: tcp
+  port: 0
+...
 sc:nonblock(true)
 ---
 - true
diff --git a/test/box/bsdsocket.test.lua b/test/box/bsdsocket.test.lua
index a7e6942a7a823d0490b851ef71d8e4760b78542e..8a78cea3edce78e81f6639e0c3bcc80daeefab1e 100644
--- a/test/box/bsdsocket.test.lua
+++ b/test/box/bsdsocket.test.lua
@@ -205,6 +205,7 @@ json.encode(socket.getaddrinfo('ya.ru', '80',
 
 sc = socket('AF_INET', 'SOCK_STREAM', 'tcp')
 json.encode(sc:name())
+sc:name()
 sc:nonblock(true)
 sc:close()