@@ -165,6 +165,19 @@ void UDPWrap::GetFD(const FunctionCallbackInfo<Value>& args) {
165
165
args.GetReturnValue ().Set (fd);
166
166
}
167
167
168
+ int sockaddr_for_family (int address_family,
169
+ const char * address,
170
+ const unsigned short port,
171
+ struct sockaddr_storage * addr) {
172
+ switch (address_family) {
173
+ case AF_INET:
174
+ return uv_ip4_addr (address, port, reinterpret_cast <sockaddr_in*>(addr));
175
+ case AF_INET6:
176
+ return uv_ip6_addr (address, port, reinterpret_cast <sockaddr_in6*>(addr));
177
+ default :
178
+ CHECK (0 && " unexpected address family" );
179
+ }
180
+ }
168
181
169
182
void UDPWrap::DoBind (const FunctionCallbackInfo<Value>& args, int family) {
170
183
UDPWrap* wrap;
@@ -181,24 +194,11 @@ void UDPWrap::DoBind(const FunctionCallbackInfo<Value>& args, int family) {
181
194
if (!args[1 ]->Uint32Value (ctx).To (&port) ||
182
195
!args[2 ]->Uint32Value (ctx).To (&flags))
183
196
return ;
184
- char addr[sizeof (sockaddr_in6)];
185
- int err;
186
-
187
- switch (family) {
188
- case AF_INET:
189
- err = uv_ip4_addr (*address, port, reinterpret_cast <sockaddr_in*>(&addr));
190
- break ;
191
- case AF_INET6:
192
- err = uv_ip6_addr (*address, port, reinterpret_cast <sockaddr_in6*>(&addr));
193
- break ;
194
- default :
195
- CHECK (0 && " unexpected address family" );
196
- ABORT ();
197
- }
198
-
197
+ struct sockaddr_storage addr_storage;
198
+ int err = sockaddr_for_family (family, address.out (), port, &addr_storage);
199
199
if (err == 0 ) {
200
200
err = uv_udp_bind (&wrap->handle_ ,
201
- reinterpret_cast <const sockaddr*>(&addr ),
201
+ reinterpret_cast <const sockaddr*>(&addr_storage ),
202
202
flags);
203
203
}
204
204
@@ -369,27 +369,14 @@ void UDPWrap::DoSend(const FunctionCallbackInfo<Value>& args, int family) {
369
369
370
370
req_wrap->msg_size = msg_size;
371
371
372
- char addr[sizeof (sockaddr_in6)];
373
- int err;
374
-
375
- switch (family) {
376
- case AF_INET:
377
- err = uv_ip4_addr (*address, port, reinterpret_cast <sockaddr_in*>(&addr));
378
- break ;
379
- case AF_INET6:
380
- err = uv_ip6_addr (*address, port, reinterpret_cast <sockaddr_in6*>(&addr));
381
- break ;
382
- default :
383
- CHECK (0 && " unexpected address family" );
384
- ABORT ();
385
- }
386
-
372
+ struct sockaddr_storage addr_storage;
373
+ int err = sockaddr_for_family (family, address.out (), port, &addr_storage);
387
374
if (err == 0 ) {
388
375
err = req_wrap->Dispatch (uv_udp_send,
389
376
&wrap->handle_ ,
390
377
*bufs,
391
378
count,
392
- reinterpret_cast <const sockaddr*>(&addr ),
379
+ reinterpret_cast <const sockaddr*>(&addr_storage ),
393
380
OnSend);
394
381
}
395
382
0 commit comments