@@ -175,6 +175,19 @@ void UDPWrap::GetFD(const FunctionCallbackInfo<Value>& args) {
175
175
args.GetReturnValue ().Set (fd);
176
176
}
177
177
178
+ int sockaddr_for_family (int address_family,
179
+ const char * address,
180
+ const unsigned short port,
181
+ struct sockaddr_storage * addr) {
182
+ switch (address_family) {
183
+ case AF_INET:
184
+ return uv_ip4_addr (address, port, reinterpret_cast <sockaddr_in*>(addr));
185
+ case AF_INET6:
186
+ return uv_ip6_addr (address, port, reinterpret_cast <sockaddr_in6*>(addr));
187
+ default :
188
+ CHECK (0 && " unexpected address family" );
189
+ }
190
+ }
178
191
179
192
void UDPWrap::DoBind (const FunctionCallbackInfo<Value>& args, int family) {
180
193
UDPWrap* wrap;
@@ -191,24 +204,11 @@ void UDPWrap::DoBind(const FunctionCallbackInfo<Value>& args, int family) {
191
204
if (!args[1 ]->Uint32Value (ctx).To (&port) ||
192
205
!args[2 ]->Uint32Value (ctx).To (&flags))
193
206
return ;
194
- char addr[sizeof (sockaddr_in6)];
195
- int err;
196
-
197
- switch (family) {
198
- case AF_INET:
199
- err = uv_ip4_addr (*address, port, reinterpret_cast <sockaddr_in*>(&addr));
200
- break ;
201
- case AF_INET6:
202
- err = uv_ip6_addr (*address, port, reinterpret_cast <sockaddr_in6*>(&addr));
203
- break ;
204
- default :
205
- CHECK (0 && " unexpected address family" );
206
- ABORT ();
207
- }
208
-
207
+ struct sockaddr_storage addr_storage;
208
+ int err = sockaddr_for_family (family, address.out (), port, &addr_storage);
209
209
if (err == 0 ) {
210
210
err = uv_udp_bind (&wrap->handle_ ,
211
- reinterpret_cast <const sockaddr*>(&addr ),
211
+ reinterpret_cast <const sockaddr*>(&addr_storage ),
212
212
flags);
213
213
}
214
214
@@ -392,27 +392,14 @@ void UDPWrap::DoSend(const FunctionCallbackInfo<Value>& args, int family) {
392
392
393
393
req_wrap->msg_size = msg_size;
394
394
395
- char addr[sizeof (sockaddr_in6)];
396
- int err;
397
-
398
- switch (family) {
399
- case AF_INET:
400
- err = uv_ip4_addr (*address, port, reinterpret_cast <sockaddr_in*>(&addr));
401
- break ;
402
- case AF_INET6:
403
- err = uv_ip6_addr (*address, port, reinterpret_cast <sockaddr_in6*>(&addr));
404
- break ;
405
- default :
406
- CHECK (0 && " unexpected address family" );
407
- ABORT ();
408
- }
409
-
395
+ struct sockaddr_storage addr_storage;
396
+ int err = sockaddr_for_family (family, address.out (), port, &addr_storage);
410
397
if (err == 0 ) {
411
398
err = req_wrap->Dispatch (uv_udp_send,
412
399
&wrap->handle_ ,
413
400
*bufs,
414
401
count,
415
- reinterpret_cast <const sockaddr*>(&addr ),
402
+ reinterpret_cast <const sockaddr*>(&addr_storage ),
416
403
OnSend);
417
404
}
418
405
0 commit comments