Index: uspace/lib/c/generic/net/socket_client.c
===================================================================
--- uspace/lib/c/generic/net/socket_client.c	(revision d493830e8ac528a63cbebc60d21ffdcb0fa60ef8)
+++ uspace/lib/c/generic/net/socket_client.c	(revision 727f04f2d1844c7dc0bcdc1f10ea16d670220276)
@@ -966,5 +966,6 @@
  *			read. The actual address length is set. Used only if
  *			fromaddr is not NULL.
- * @return		EOK on success.
+ * @return		Positive received message size in bytes on success.
+ * @return		Zero if no more data (other side closed the connection).
  * @return		ENOTSOCK if the socket is not found.
  * @return		EBADMEM if the data parameter is NULL.
@@ -972,5 +973,5 @@
  * @return		Other error codes as defined for the spcific message.
  */
-static int
+static ssize_t
 recvfrom_core(sysarg_t message, int socket_id, void *data, size_t datalength,
     int flags, struct sockaddr *fromaddr, socklen_t *addrlen)
@@ -984,4 +985,5 @@
 	size_t index;
 	ipc_call_t answer;
+	ssize_t retval;
 
 	if (!data)
@@ -1083,13 +1085,15 @@
 		dyn_fifo_pop(&socket->received);
 		// return read data length
-		result = SOCKET_GET_READ_DATA_LENGTH(answer);
+		retval = SOCKET_GET_READ_DATA_LENGTH(answer);
 		// set address length
 		if (fromaddr && addrlen)
 			*addrlen = SOCKET_GET_ADDRESS_LENGTH(answer);
+	} else {
+		retval = (ssize_t) result;
 	}
 
 	fibril_mutex_unlock(&socket->receive_lock);
 	fibril_rwlock_read_unlock(&socket_globals.lock);
-	return result;
+	return retval;
 }
 
@@ -1100,5 +1104,6 @@
  * @param[in] datalength The data length.
  * @param[in] flags	Various receive flags.
- * @return		EOK on success.
+ * @return		Positive received message size in bytes on success.
+ * @return		Zero if no more data (other side closed the connection).
  * @return		ENOTSOCK if the socket is not found.
  * @return		EBADMEM if the data parameter is NULL.
@@ -1107,5 +1112,5 @@
  *			message.
  */
-int recv(int socket_id, void *data, size_t datalength, int flags)
+ssize_t recv(int socket_id, void *data, size_t datalength, int flags)
 {
 	// without the address
@@ -1123,5 +1128,6 @@
  * @param[in,out] addrlen The address length. The maximum address length is
  *			read. The actual address length is set.
- * @return		EOK on success.
+ * @return		Positive received message size in bytes on success.
+ * @return		Zero if no more data (other side closed the connection).
  * @return		ENOTSOCK if the socket is not found.
  * @return		EBADMEM if the data or fromaddr parameter is NULL.
@@ -1130,5 +1136,5 @@
  *			message.
  */
-int
+ssize_t
 recvfrom(int socket_id, void *data, size_t datalength, int flags,
     struct sockaddr *fromaddr, socklen_t *addrlen)
Index: uspace/lib/c/include/net/socket.h
===================================================================
--- uspace/lib/c/include/net/socket.h	(revision d493830e8ac528a63cbebc60d21ffdcb0fa60ef8)
+++ uspace/lib/c/include/net/socket.h	(revision 727f04f2d1844c7dc0bcdc1f10ea16d670220276)
@@ -60,6 +60,6 @@
 extern int sendto(int, const void *, size_t, int, const struct sockaddr *,
     socklen_t);
-extern int recv(int, void *, size_t, int);
-extern int recvfrom(int, void *, size_t, int, struct sockaddr *, socklen_t *);
+extern ssize_t recv(int, void *, size_t, int);
+extern ssize_t recvfrom(int, void *, size_t, int, struct sockaddr *, socklen_t *);
 extern int getsockopt(int, int, int, void *, size_t *);
 extern int setsockopt(int, int, int, const void *, size_t);
