255822bb436f9cd7f0cf35494c701370acc477cc
11 WORD wVersionRequested
;
15 wVersionRequested
= MAKEWORD(2, 2);
16 ret
= WSAStartup(wVersionRequested
, &wsaData
);
21 if (LOBYTE(wsaData
.wVersion
) != 2 ||
22 HIBYTE(wsaData
.wVersion
) != 2) {
23 /* Version mismatch, requested version not found */
39 netutils_init_socket(unsigned short *port
, int use_ipv6
, int use_udp
)
41 int family
= use_ipv6
? AF_INET6
: AF_INET
;
42 int type
= use_udp
? SOCK_DGRAM
: SOCK_STREAM
;
43 int proto
= use_udp
? IPPROTO_UDP
: IPPROTO_TCP
;
45 struct sockaddr_storage saddr
;
52 server_fd
= socket(family
, type
, proto
);
53 if (server_fd
== -1) {
57 memset(&saddr
, 0, sizeof(saddr
));
59 struct sockaddr_in6
*sin6ptr
= (struct sockaddr_in6
*)&saddr
;
61 /* Initialize sockaddr for bind */
62 sin6ptr
->sin6_family
= family
;
63 sin6ptr
->sin6_addr
= in6addr_any
;
64 sin6ptr
->sin6_port
= htons(*port
);
66 socklen
= sizeof(*sin6ptr
);
67 ret
= bind(server_fd
, (struct sockaddr
*)sin6ptr
, socklen
);
72 ret
= getsockname(server_fd
, (struct sockaddr
*)sin6ptr
, &socklen
);
76 *port
= ntohs(sin6ptr
->sin6_port
);
78 struct sockaddr_in
*sinptr
= (struct sockaddr_in
*)&saddr
;
80 /* Initialize sockaddr for bind */
81 sinptr
->sin_family
= family
;
82 sinptr
->sin_addr
.s_addr
= INADDR_ANY
;
83 sinptr
->sin_port
= htons(*port
);
85 socklen
= sizeof(*sinptr
);
86 ret
= bind(server_fd
, (struct sockaddr
*)sinptr
, socklen
);
91 ret
= getsockname(server_fd
, (struct sockaddr
*)sinptr
, &socklen
);
95 *port
= ntohs(sinptr
->sin_port
);
100 ret
= SOCKET_GET_ERROR();
101 if (server_fd
!= -1) {
102 closesocket(server_fd
);
104 SOCKET_SET_ERROR(ret
);
109 netutils_get_address(void *sockaddr
, int *length
)
111 unsigned char ipv4_prefix
[] = { 0,0,0,0,0,0,0,0,0,0,255,255 };
112 struct sockaddr
*address
= sockaddr
;
117 if (address
->sa_family
== AF_INET
) {
118 struct sockaddr_in
*sin
;
120 sin
= (struct sockaddr_in
*)address
;
121 *length
= sizeof(sin
->sin_addr
.s_addr
);
122 return (unsigned char *)&sin
->sin_addr
.s_addr
;
123 } else if (address
->sa_family
== AF_INET6
) {
124 struct sockaddr_in6
*sin6
;
126 sin6
= (struct sockaddr_in6
*)address
;
127 if (!memcmp(sin6
->sin6_addr
.s6_addr
, ipv4_prefix
, 12)) {
128 /* Actually an embedded IPv4 address */
129 *length
= sizeof(sin6
->sin6_addr
.s6_addr
)-12;
130 return (sin6
->sin6_addr
.s6_addr
+12);
132 *length
= sizeof(sin6
->sin6_addr
.s6_addr
);
133 return sin6
->sin6_addr
.s6_addr
;