@@ -165,6 +165,19 @@ void UDPWrap::GetFD(const FunctionCallbackInfo<Value>& args) {
165165 args.GetReturnValue ().Set (fd);
166166}
167167
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+ }
168181
169182void UDPWrap::DoBind (const FunctionCallbackInfo<Value>& args, int family) {
170183 UDPWrap* wrap;
@@ -181,24 +194,11 @@ void UDPWrap::DoBind(const FunctionCallbackInfo<Value>& args, int family) {
181194 if (!args[1 ]->Uint32Value (ctx).To (&port) ||
182195 !args[2 ]->Uint32Value (ctx).To (&flags))
183196 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);
199199 if (err == 0 ) {
200200 err = uv_udp_bind (&wrap->handle_ ,
201- reinterpret_cast <const sockaddr*>(&addr ),
201+ reinterpret_cast <const sockaddr*>(&addr_storage ),
202202 flags);
203203 }
204204
@@ -369,27 +369,14 @@ void UDPWrap::DoSend(const FunctionCallbackInfo<Value>& args, int family) {
369369
370370 req_wrap->msg_size = msg_size;
371371
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);
387374 if (err == 0 ) {
388375 err = req_wrap->Dispatch (uv_udp_send,
389376 &wrap->handle_ ,
390377 *bufs,
391378 count,
392- reinterpret_cast <const sockaddr*>(&addr ),
379+ reinterpret_cast <const sockaddr*>(&addr_storage ),
393380 OnSend);
394381 }
395382
0 commit comments