@@ -175,6 +175,19 @@ void UDPWrap::GetFD(const FunctionCallbackInfo<Value>& args) {
175175 args.GetReturnValue ().Set (fd);
176176}
177177
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+ }
178191
179192void UDPWrap::DoBind (const FunctionCallbackInfo<Value>& args, int family) {
180193 UDPWrap* wrap;
@@ -191,24 +204,11 @@ void UDPWrap::DoBind(const FunctionCallbackInfo<Value>& args, int family) {
191204 if (!args[1 ]->Uint32Value (ctx).To (&port) ||
192205 !args[2 ]->Uint32Value (ctx).To (&flags))
193206 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);
209209 if (err == 0 ) {
210210 err = uv_udp_bind (&wrap->handle_ ,
211- reinterpret_cast <const sockaddr*>(&addr ),
211+ reinterpret_cast <const sockaddr*>(&addr_storage ),
212212 flags);
213213 }
214214
@@ -392,27 +392,14 @@ void UDPWrap::DoSend(const FunctionCallbackInfo<Value>& args, int family) {
392392
393393 req_wrap->msg_size = msg_size;
394394
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);
410397 if (err == 0 ) {
411398 err = req_wrap->Dispatch (uv_udp_send,
412399 &wrap->handle_ ,
413400 *bufs,
414401 count,
415- reinterpret_cast <const sockaddr*>(&addr ),
402+ reinterpret_cast <const sockaddr*>(&addr_storage ),
416403 OnSend);
417404 }
418405
0 commit comments