int mono_w32socket_recvbuffers (SOCKET sock, WSABUF *buffers, guint32 count, guint32 *received, guint32 *flags, gpointer overlapped, gpointer complete, gboolean blocking) { MonoW32HandleSocket *socket_handle; MonoThreadInfo *info; gpointer handle; gint ret; struct msghdr hdr; g_assert (overlapped == NULL); g_assert (complete == NULL); handle = GUINT_TO_POINTER (sock); if (!mono_w32handle_lookup (handle, MONO_W32HANDLE_SOCKET, (gpointer *)&socket_handle)) { mono_w32socket_set_last_error (WSAENOTSOCK); return SOCKET_ERROR; } info = mono_thread_info_current (); wsabuf_to_msghdr (buffers, count, &hdr); do { ret = recvmsg (sock, &hdr, *flags); } while (ret == -1 && errno == EINTR && !mono_thread_info_is_interrupt_state (info)); msghdr_iov_free (&hdr); if (ret == 0) { /* see mono_w32socket_recvfrom */ if (socket_handle->still_readable != 1) { ret = -1; errno = EINTR; } } if (ret == -1) { gint errnum = errno; mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: recvmsg error: %s", __func__, g_strerror(errno)); mono_w32socket_set_last_error (mono_w32socket_convert_error (errnum)); return SOCKET_ERROR; } *received = ret; *flags = hdr.msg_flags; return 0; }
int WSASend (guint32 fd, WapiWSABuf *buffers, guint32 count, guint32 *sent, guint32 flags, WapiOverlapped *overlapped, WapiOverlappedCB *complete) { int ret; struct msghdr hdr; g_assert (overlapped == NULL); g_assert (complete == NULL); wsabuf_to_msghdr (buffers, count, &hdr); ret = _wapi_sendmsg (fd, &hdr, flags); msghdr_iov_free (&hdr); if(ret == SOCKET_ERROR) return ret; *sent = ret; return 0; }
int WSARecv (guint32 fd, WapiWSABuf *buffers, guint32 count, guint32 *received, guint32 *flags, WapiOverlapped *overlapped, WapiOverlappedCB *complete) { int ret; struct msghdr hdr; g_assert (overlapped == NULL); g_assert (complete == NULL); wsabuf_to_msghdr (buffers, count, &hdr); ret = _wapi_recvmsg (fd, &hdr, *flags); msghdr_iov_free (&hdr); if(ret == SOCKET_ERROR) { return(ret); } *received = ret; *flags = hdr.msg_flags; return(0); }
int mono_w32socket_sendbuffers (SOCKET sock, WSABUF *buffers, guint32 count, guint32 *sent, guint32 flags, gpointer overlapped, gpointer complete, gboolean blocking) { struct msghdr hdr; MonoThreadInfo *info; gpointer handle; gint ret; g_assert (overlapped == NULL); g_assert (complete == NULL); handle = GUINT_TO_POINTER (sock); if (mono_w32handle_get_type (handle) != MONO_W32HANDLE_SOCKET) { mono_w32socket_set_last_error (WSAENOTSOCK); return SOCKET_ERROR; } info = mono_thread_info_current (); wsabuf_to_msghdr (buffers, count, &hdr); do { ret = sendmsg (sock, &hdr, flags); } while (ret == -1 && errno == EINTR && !mono_thread_info_is_interrupt_state (info)); msghdr_iov_free (&hdr); if (ret == -1) { gint errnum = errno; mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: sendmsg error: %s", __func__, g_strerror (errno)); mono_w32socket_set_last_error (mono_w32socket_convert_error (errnum)); return SOCKET_ERROR; } *sent = ret; return 0; }