diff --git a/src/lua/bsdsocket.lua b/src/lua/bsdsocket.lua
index 793ae416bcb526e79345d27bdcca637f7ca7497f..6a9caef5514b4fc6e651c1fa95826ef2ea7bb9d3 100644
--- a/src/lua/bsdsocket.lua
+++ b/src/lua/bsdsocket.lua
@@ -706,18 +706,19 @@ socket_methods.write = function(self, octets, timeout)
         timeout = TIMEOUT_INFINITY
     end
 
+    local total_len = #octets
     local started = fiber.time()
     while true do
         local written = self:syswrite(octets)
         if written == nil then
             if not errno_is_transient[self:errno()] then
-                return false
+                return nil
             end
             written = 0
         end
 
         if written == string.len(octets) then
-            return true
+            return total_len
         end
         if written > 0 then
             octets = string.sub(octets, written + 1)
@@ -735,11 +736,11 @@ socket_methods.send = function(self, octets, flags)
 
     self._errno = nil
     local res = ffi.C.send(fd, octets, string.len(octets), iflags)
-    if res == -1 then
+    if res < 0 then
         self._errno = boxerrno()
-        return false
+        return nil
     end
-    return true
+    return tonumber(res)
 end
 
 socket_methods.recv = function(self, size, flags)
@@ -807,9 +808,9 @@ socket_methods.sendto = function(self, host, port, octets, flags)
     end
     if res < 0 then
         self._errno = boxerrno()
-        return false
+        return nil
     end
-    return true
+    return tonumber(res)
 end
 
 local function create_socket(domain, stype, proto)
diff --git a/test/box/bsdsocket.result b/test/box/bsdsocket.result
index bc27c950ae152b66ca1c52d8bfce8c29ee16e299..7437f619021e3cd8402dbe5192130b69649d620b 100644
--- a/test/box/bsdsocket.result
+++ b/test/box/bsdsocket.result
@@ -358,7 +358,7 @@ sc:writable(10)
 ...
 sc:write('Hello, world')
 ---
-- true
+- 12
 ...
 sa, addr = s:accept()
 ---
@@ -392,7 +392,7 @@ sc:writable()
 ...
 sc:write(', again')
 ---
-- true
+- 7
 ...
 sa:read(8)
 ---
@@ -420,7 +420,7 @@ sc:writable()
 ...
 sc:send('abc')
 ---
-- true
+- 3
 ...
 sa:read(3)
 ---
@@ -428,7 +428,7 @@ sa:read(3)
 ...
 sc:send('Hello')
 ---
-- true
+- 5
 ...
 sa:readable()
 ---
@@ -444,15 +444,15 @@ sa:recv()
 ...
 sc:send('Hello')
 ---
-- true
+- 5
 ...
 sc:send(', world')
 ---
-- true
+- 7
 ...
 sc:send("\\nnew line")
 ---
-- true
+- 10
 ...
 sa:read('\\n', 1)
 ---
@@ -472,7 +472,7 @@ sa:read('ine', 0.1)
 ...
 sc:send('Hello, world')
 ---
-- true
+- 12
 ...
 sa:read(',', 1)
 ---
@@ -567,7 +567,7 @@ sa:nonblock(true)
 ...
 sa:send('Hello, world')
 ---
-- true
+- 12
 ...
 sc:recv()
 ---
@@ -704,7 +704,7 @@ sc = socket('AF_INET', 'SOCK_DGRAM', 'udp')
 ...
 sc:sendto('127.0.0.1', 3548, 'Hello, world')
 ---
-- true
+- 12
 ...
 s:readable(10)
 ---
@@ -716,7 +716,7 @@ s:recv()
 ...
 sc:sendto('127.0.0.1', 3548, 'Hello, world, 2')
 ---
-- true
+- 15
 ...
 s:readable(10)
 ---
@@ -772,7 +772,7 @@ sc:sendto('127.0.0.1', s:name().port)
 ...
 sc:sendto('127.0.0.1', s:name().port, 'Hello, World!')
 ---
-- true
+- 13
 ...
 s:readable(1)
 ---
@@ -787,7 +787,7 @@ data
 ...
 s:sendto(from.host, from.port, 'Hello, hello!')
 ---
-- true
+- 13
 ...
 sc:readable(1)
 ---
@@ -830,7 +830,7 @@ string.match(tostring(s), ', peer') ~= nil
 ...
 s:write("HEAD / HTTP/1.0\r\nHost: tarantool.org\r\n\r\n")
 ---
-- true
+- 40
 ...
 header = s:read({chunk = 4000, delimiter = {"\n\n", "\r\n\r\n" }}, 1)
 ---
@@ -1322,7 +1322,7 @@ cnt
 ...
 client:write('hi')
 ---
-- true
+- 2
 ...
 client:read(123)
 ---