diff --git a/src/win/internal.h b/src/win/internal.h index d7aae53e64..ab88373879 100644 --- a/src/win/internal.h +++ b/src/win/internal.h @@ -155,6 +155,7 @@ int uv_tcp_import(uv_tcp_t* tcp, uv__ipc_socket_info_ex* socket_info_ex, int uv_tcp_duplicate_socket(uv_tcp_t* handle, int pid, LPWSAPROTOCOL_INFOW protocol_info); +int uv_tcp_try_write(uv_tcp_t* handle, const uv_buf_t bufs[], unsigned int nbufs); /* * UDP diff --git a/src/win/stream.c b/src/win/stream.c index 057f72ecad..34aec49291 100644 --- a/src/win/stream.c +++ b/src/win/stream.c @@ -184,7 +184,13 @@ int uv_write2(uv_write_t* req, int uv_try_write(uv_stream_t* stream, const uv_buf_t bufs[], unsigned int nbufs) { - /* NOTE: Won't work with overlapped writes */ + switch (stream->type) { + case UV_TCP: + return uv_tcp_try_write((uv_tcp_t*) stream, bufs, nbufs); + break; + default: + break; + } return UV_ENOSYS; } diff --git a/src/win/tcp.c b/src/win/tcp.c index 23fadc220d..540c97f491 100644 --- a/src/win/tcp.c +++ b/src/win/tcp.c @@ -876,6 +876,22 @@ int uv_tcp_write(uv_loop_t* loop, } +int uv_tcp_try_write(uv_tcp_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs) { + DWORD bytes = 0; + if (WSASend(((uv_tcp_t*) handle)->socket, + (WSABUF*) bufs, + nbufs, + &bytes, + 0, + NULL, + NULL) == 0) + return (int) bytes; + return uv_translate_sys_error(WSAGetLastError()); +} + + void uv_process_tcp_read_req(uv_loop_t* loop, uv_tcp_t* handle, uv_req_t* req) { DWORD bytes, flags, err; diff --git a/test/test-tcp-try-write.c b/test/test-tcp-try-write.c index baff6cf36c..8a60136b64 100644 --- a/test/test-tcp-try-write.c +++ b/test/test-tcp-try-write.c @@ -28,16 +28,6 @@ #define MAX_BYTES 1024 * 1024 -#ifdef _WIN32 - -TEST_IMPL(tcp_try_write) { - - MAKE_VALGRIND_HAPPY(); - return 0; -} - -#else /* !_WIN32 */ - static uv_tcp_t server; static uv_tcp_t client; static uv_tcp_t incoming; @@ -138,5 +128,3 @@ TEST_IMPL(tcp_try_write) { MAKE_VALGRIND_HAPPY(); return 0; } - -#endif /* !_WIN32 */