Go to the documentation of this file.
40 struct sockaddr*
name,
52 struct sockaddr*
name,
66 WSAPROTOCOL_INFOW info;
69 if (
handle->socket != INVALID_SOCKET)
73 if (ioctlsocket(
socket, FIONBIO, &yes) == SOCKET_ERROR) {
74 return WSAGetLastError();
78 if (!SetHandleInformation((HANDLE)
socket, HANDLE_FLAG_INHERIT, 0)) {
79 return GetLastError();
84 if (CreateIoCompletionPort((HANDLE)
socket,
88 return GetLastError();
96 opt_len = (
int)
sizeof info;
98 socket, SOL_SOCKET, SO_PROTOCOL_INFOW, (
char*) &info, &opt_len) ==
100 return GetLastError();
103 if (info.ProtocolChain.ChainLen == 1) {
104 if (SetFileCompletionNotificationModes(
111 }
else if (GetLastError() != ERROR_INVALID_FUNCTION) {
112 return GetLastError();
132 domain =
flags & 0xFF;
133 if (domain != AF_INET && domain !=
AF_INET6 && domain != AF_UNSPEC)
140 handle->socket = INVALID_SOCKET;
143 handle->func_wsarecv = WSARecv;
144 handle->func_wsarecvfrom = WSARecvFrom;
145 handle->send_queue_size = 0;
146 handle->send_queue_count = 0;
154 if (domain != AF_UNSPEC) {
158 sock =
socket(domain, SOCK_DGRAM, 0);
159 if (sock == INVALID_SOCKET) {
160 err = WSAGetLastError();
185 handle->socket = INVALID_SOCKET;
189 if (
handle->reqs_pending == 0) {
197 handle->reqs_pending == 0) {
205 const struct sockaddr*
addr,
206 unsigned int addrlen,
207 unsigned int flags) {
217 return ERROR_INVALID_PARAMETER;
220 if (
handle->socket == INVALID_SOCKET) {
221 SOCKET sock =
socket(
addr->sa_family, SOCK_DGRAM, 0);
222 if (sock == INVALID_SOCKET) {
223 return WSAGetLastError();
236 if (setsockopt(
handle->socket,
240 sizeof yes) == SOCKET_ERROR) {
241 err = WSAGetLastError();
256 setsockopt(
handle->socket,
264 if (
r == SOCKET_ERROR) {
265 return WSAGetLastError();
284 memset(&
req->u.io.overlapped, 0,
sizeof(
req->u.io.overlapped));
295 if (
handle->recv_buffer.base == NULL ||
handle->recv_buffer.len == 0) {
299 assert(
handle->recv_buffer.base != NULL);
311 (
struct sockaddr*) &
handle->recv_from,
313 &
req->u.io.overlapped,
319 req->u.io.overlapped.InternalHigh =
bytes;
345 &
req->u.io.overlapped,
351 req->u.io.overlapped.InternalHigh =
bytes;
386 loop->active_udp_streams++;
403 handle->loop->active_udp_streams--;
415 const struct sockaddr*
addr,
416 unsigned int addrlen,
424 memset(&
req->u.io.overlapped, 0,
sizeof(
req->u.io.overlapped));
433 &
req->u.io.overlapped,
438 req->u.io.queued_bytes = 0;
440 handle->send_queue_size +=
req->u.io.queued_bytes;
441 handle->send_queue_count++;
448 handle->send_queue_size +=
req->u.io.queued_bytes;
449 handle->send_queue_count++;
453 return WSAGetLastError();
465 assert(
handle->type == UV_UDP);
471 if (
err == WSAEMSGSIZE) {
474 }
else if (
err == WSAECONNRESET ||
err == WSAENETRESET) {
499 req->u.io.overlapped.InternalHigh,
501 (
const struct sockaddr*) &
handle->recv_from,
505 struct sockaddr_storage
from;
512 if (
buf.base == NULL ||
buf.len == 0) {
516 assert(
buf.base != NULL);
519 from_len =
sizeof from;
523 if (WSARecvFrom(
handle->socket,
528 (
struct sockaddr*) &
from,
531 NULL) != SOCKET_ERROR) {
536 err = WSAGetLastError();
537 if (
err == WSAEMSGSIZE) {
542 (
const struct sockaddr*) &
from,
544 }
else if (
err == WSAEWOULDBLOCK) {
547 }
else if (
err == WSAECONNRESET ||
err == WSAENETRESET) {
575 assert(
handle->type == UV_UDP);
577 assert(
handle->send_queue_size >=
req->u.io.queued_bytes);
578 assert(
handle->send_queue_count >= 1);
579 handle->send_queue_size -=
req->u.io.queued_bytes;
580 handle->send_queue_count--;
597 const struct sockaddr_in* multicast_addr,
598 const char* interface_addr,
615 memset(&mreq, 0,
sizeof mreq);
617 if (interface_addr) {
618 err =
uv_inet_pton(AF_INET, interface_addr, &mreq.imr_interface.s_addr);
622 mreq.imr_interface.s_addr = htonl(INADDR_ANY);
625 mreq.imr_multiaddr.s_addr = multicast_addr->sin_addr.s_addr;
627 switch (membership) {
629 optname = IP_ADD_MEMBERSHIP;
632 optname = IP_DROP_MEMBERSHIP;
638 if (setsockopt(
handle->socket,
642 sizeof mreq) == SOCKET_ERROR) {
652 const char* interface_addr,
656 struct ipv6_mreq mreq;
670 memset(&mreq, 0,
sizeof(mreq));
672 if (interface_addr) {
677 mreq.ipv6mr_interface = 0;
680 mreq.ipv6mr_multiaddr = multicast_addr->
sin6_addr;
682 switch (membership) {
684 optname = IPV6_ADD_MEMBERSHIP;
687 optname = IPV6_DROP_MEMBERSHIP;
693 if (setsockopt(
handle->socket,
697 sizeof mreq) == SOCKET_ERROR) {
706 const struct sockaddr_in* multicast_addr,
707 const char* interface_addr,
708 const struct sockaddr_in* source_addr,
710 struct ip_mreq_source mreq;
725 memset(&mreq, 0,
sizeof(mreq));
727 if (interface_addr != NULL) {
728 err =
uv_inet_pton(AF_INET, interface_addr, &mreq.imr_interface.s_addr);
732 mreq.imr_interface.s_addr = htonl(INADDR_ANY);
735 mreq.imr_multiaddr.s_addr = multicast_addr->sin_addr.s_addr;
736 mreq.imr_sourceaddr.s_addr = source_addr->sin_addr.s_addr;
739 optname = IP_ADD_SOURCE_MEMBERSHIP;
741 optname = IP_DROP_SOURCE_MEMBERSHIP;
745 if (setsockopt(
handle->socket,
749 sizeof(mreq)) == SOCKET_ERROR) {
759 const char* interface_addr,
762 struct group_source_req mreq;
778 memset(&mreq, 0,
sizeof(mreq));
780 if (interface_addr != NULL) {
786 mreq.gsr_interface = 0;
789 memcpy(&mreq.gsr_group, multicast_addr,
sizeof(mreq.gsr_group));
790 memcpy(&mreq.gsr_source, source_addr,
sizeof(mreq.gsr_source));
799 if (setsockopt(
handle->socket,
803 sizeof(mreq)) == SOCKET_ERROR) {
812 const char* multicast_addr,
813 const char* interface_addr,
815 struct sockaddr_in
addr4;
828 const char* multicast_addr,
829 const char* interface_addr,
830 const char* source_addr,
833 struct sockaddr_storage mcast_addr;
834 struct sockaddr_in* mcast_addr4;
836 struct sockaddr_storage src_addr;
837 struct sockaddr_in* src_addr4;
840 mcast_addr4 = (
struct sockaddr_in*)&mcast_addr;
842 src_addr4 = (
struct sockaddr_in*)&src_addr;
872 struct sockaddr_storage addr_st;
873 struct sockaddr_in*
addr4;
876 addr4 = (
struct sockaddr_in*) &addr_st;
879 if (!interface_addr) {
880 memset(&addr_st, 0,
sizeof addr_st);
885 addr_st.ss_family = AF_INET;
886 addr4->sin_addr.s_addr = htonl(INADDR_ANY);
896 if (
handle->socket == INVALID_SOCKET)
899 if (addr_st.ss_family == AF_INET) {
900 if (setsockopt(
handle->socket,
903 (
char*) &
addr4->sin_addr,
904 sizeof(
addr4->sin_addr)) == SOCKET_ERROR) {
907 }
else if (addr_st.ss_family ==
AF_INET6) {
908 if (setsockopt(
handle->socket,
916 assert(0 &&
"unexpected address family");
927 if (
handle->socket == INVALID_SOCKET)
930 if (setsockopt(
handle->socket,
943 struct sockaddr_storage
addr;
946 addrlen =
sizeof(
addr);
955 WSAPROTOCOL_INFOW protocol_info;
960 opt_len = (
int)
sizeof protocol_info;
964 (
char*) &protocol_info,
965 &opt_len) == SOCKET_ERROR) {
972 protocol_info.iAddressFamily);
986 #define SOCKOPT_SETTER(name, option4, option6, validate) \
987 int uv_udp_set_##name(uv_udp_t* handle, int value) { \
988 DWORD optval = (DWORD) value; \
990 if (!(validate(value))) { \
994 if (handle->socket == INVALID_SOCKET) \
997 if (!(handle->flags & UV_HANDLE_IPV6)) { \
999 if (setsockopt(handle->socket, \
1004 return uv_translate_sys_error(WSAGetLastError()); \
1008 if (setsockopt(handle->socket, \
1013 return uv_translate_sys_error(WSAGetLastError()); \
1019 #define VALIDATE_TTL(value) ((value) >= 1 && (value) <= 255)
1020 #define VALIDATE_MULTICAST_TTL(value) ((value) >= -1 && (value) <= 255)
1021 #define VALIDATE_MULTICAST_LOOP(value) (1)
1029 IPV6_MULTICAST_HOPS,
1033 IPV6_MULTICAST_LOOP,
1036 #undef SOCKOPT_SETTER
1038 #undef VALIDATE_MULTICAST_TTL
1039 #undef VALIDATE_MULTICAST_LOOP
1046 const struct sockaddr*
addr,
1047 unsigned int addrlen,
1048 unsigned int flags) {
1060 const struct sockaddr*
addr,
1061 unsigned int addrlen) {
1062 const struct sockaddr* bind_addr;
1090 struct sockaddr
addr;
1110 const struct sockaddr*
addr,
1111 unsigned int addrlen,
1113 const struct sockaddr* bind_addr;
1140 const struct sockaddr*
addr,
1141 unsigned int addrlen) {
1143 const struct sockaddr* bind_addr;
1144 struct sockaddr_storage converted;
1156 if (
handle->send_queue_count != 0)
1176 (
const struct sockaddr*) &converted,
int uv_udp_init(uv_loop_t *loop, uv_udp_t *handle)
void uv_process_udp_recv_req(uv_loop_t *loop, uv_udp_t *handle, uv_req_t *req)
UV_EXTERN int uv_ip6_addr(const char *ip, int port, struct sockaddr_in6 *addr)
UV_EXTERN int uv_inet_pton(int af, const char *src, void *dst)
int uv_udp_set_source_membership(uv_udp_t *handle, const char *multicast_addr, const char *interface_addr, const char *source_addr, uv_membership membership)
int WSAAPI uv_wsarecv_workaround(SOCKET socket, WSABUF *buffers, DWORD buffer_count, DWORD *bytes, DWORD *flags, WSAOVERLAPPED *overlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine)
#define FILE_SKIP_SET_EVENT_ON_HANDLE
int uv__udp_is_connected(uv_udp_t *handle)
return memset(p, 0, total)
int uv_udp_set_broadcast(uv_udp_t *handle, int value)
#define MCAST_LEAVE_SOURCE_GROUP
@ UV_HANDLE_UDP_CONNECTED
static void alloc_cb(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf)
static void send_cb(uv_udp_send_t *req, int status)
#define uv__handle_close(handle)
static int uv__udp_set_membership4(uv_udp_t *handle, const struct sockaddr_in *multicast_addr, const char *interface_addr, uv_membership membership)
static void uv_udp_queue_recv(uv_loop_t *loop, uv_udp_t *handle)
int uv__udp_send(uv_udp_send_t *req, uv_udp_t *handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr *addr, unsigned int addrlen, uv_udp_send_cb send_cb)
int uv_udp_open(uv_udp_t *handle, uv_os_sock_t sock)
static int uv_udp_set_socket(uv_loop_t *loop, uv_udp_t *handle, SOCKET socket, int family)
#define FILE_SKIP_COMPLETION_PORT_ON_SUCCESS
int uv_udp_init_ex(uv_loop_t *loop, uv_udp_t *handle, unsigned int flags)
static INLINE void uv_want_endgame(uv_loop_t *loop, uv_handle_t *handle)
int uv_udp_getpeername(const uv_udp_t *handle, struct sockaddr *name, int *namelen)
void uv_udp_close(uv_loop_t *loop, uv_udp_t *handle)
static int uv__udp_set_source_membership4(uv_udp_t *handle, const struct sockaddr_in *multicast_addr, const char *interface_addr, const struct sockaddr_in *source_addr, uv_membership membership)
int uv__udp_recv_stop(uv_udp_t *handle)
UV_REQ_FIELDS uv_connect_cb cb
void(* uv_alloc_cb)(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf)
static int uv_udp_maybe_bind(uv_udp_t *handle, const struct sockaddr *addr, unsigned int addrlen, unsigned int flags)
UV_EXTERN int uv_ip4_addr(const char *ip, int port, struct sockaddr_in *addr)
#define uv__handle_closing(handle)
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
int uv__udp_bind(uv_udp_t *handle, const struct sockaddr *addr, unsigned int addrlen, unsigned int flags)
#define UNREGISTER_HANDLE_REQ(loop, handle, req)
UV_EXTERN int uv_translate_sys_error(int sys_errno)
#define DECREASE_ACTIVE_COUNT(loop, handle)
#define SET_REQ_ERROR(req, error)
int uv__udp_disconnect(uv_udp_t *handle)
int uv__getsockpeername(const uv_handle_t *handle, uv__peersockfunc func, struct sockaddr *name, int *namelen)
#define VALIDATE_MULTICAST_TTL(value)
#define VALIDATE_TTL(value)
#define REGISTER_HANDLE_REQ(loop, handle, req)
static struct sockaddr_in6 addr6
void(* uv_udp_send_cb)(uv_udp_send_t *req, int status)
int uv__udp_is_bound(uv_udp_t *handle)
static void recv_cb(uv_udp_t *handle, ssize_t nread, const uv_buf_t *buf, const struct sockaddr *addr, unsigned flags)
void(* uv_udp_recv_cb)(uv_udp_t *handle, ssize_t nread, const uv_buf_t *buf, const struct sockaddr *addr, unsigned flags)
void uv_process_udp_send_req(uv_loop_t *loop, uv_udp_t *handle, uv_udp_send_t *req)
struct sockaddr_in uv_addr_ip4_any_
int uv_udp_getsockname(const uv_udp_t *handle, struct sockaddr *name, int *namelen)
#define uv__handle_init(loop_, h, type_)
int uv_udp_set_multicast_interface(uv_udp_t *handle, const char *interface_addr)
static INLINE void uv_insert_pending_req(uv_loop_t *loop, uv_req_t *req)
static struct sockaddr_in addr4
@ UV_HANDLE_SYNC_BYPASS_IOCP
#define UV_REQ_INIT(req, typ)
int WSAAPI uv_wsarecvfrom_workaround(SOCKET socket, WSABUF *buffers, DWORD buffer_count, DWORD *bytes, DWORD *flags, struct sockaddr *addr, int *addr_len, WSAOVERLAPPED *overlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine)
#define INCREASE_ACTIVE_COUNT(loop, handle)
int uv__udp_set_membership6(uv_udp_t *handle, const struct sockaddr_in6 *multicast_addr, const char *interface_addr, uv_membership membership)
#define VALIDATE_MULTICAST_LOOP(value)
#define MCAST_JOIN_SOURCE_GROUP
#define GET_REQ_SOCK_ERROR(req)
#define DECREASE_PENDING_REQ_COUNT(handle)
void uv_udp_endgame(uv_loop_t *loop, uv_udp_t *handle)
#define SOCKOPT_SETTER(name, option4, option6, validate)
#define UV_SUCCEEDED_WITHOUT_IOCP(result)
int uv__udp_connect(uv_udp_t *handle, const struct sockaddr *addr, unsigned int addrlen)
#define UV_SUCCEEDED_WITH_IOCP(result)
struct sockaddr_in6 uv_addr_ip6_any_
UV_EXTERN uv_buf_t uv_buf_init(char *base, unsigned int len)
int uv__udp_set_source_membership6(uv_udp_t *handle, const struct sockaddr_in6 *multicast_addr, const char *interface_addr, const struct sockaddr_in6 *source_addr, uv_membership membership)
int uv__udp_try_send(uv_udp_t *handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr *addr, unsigned int addrlen)
const unsigned int uv_active_udp_streams_threshold
int uv__udp_recv_start(uv_udp_t *handle, uv_alloc_cb alloc_cb, uv_udp_recv_cb recv_cb)
int uv__convert_to_localhost_if_unspecified(const struct sockaddr *addr, struct sockaddr_storage *storage)
struct ares_in6_addr sin6_addr
static int closesocket(int sock)
size_t uv__count_bufs(const uv_buf_t bufs[], unsigned int nbufs)
UV_EXTERN int uv_udp_recv_stop(uv_udp_t *handle)
static int uv__send(uv_udp_send_t *req, uv_udp_t *handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr *addr, unsigned int addrlen, uv_udp_send_cb cb)
int uv_udp_set_membership(uv_udp_t *handle, const char *multicast_addr, const char *interface_addr, uv_membership membership)
unsigned int sin6_scope_id
OPENSSL_EXPORT pem_password_cb * cb
grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:43