1use super::display_buffer::DisplayBuffer;
2use crate::fmt::{self, Write};
3use crate::net::{IpAddr, Ipv4Addr, Ipv6Addr};
4
5#[derive(#[automatically_derived]
#[stable(feature = "rust1", since = "1.0.0")]
impl crate::marker::Copy for SocketAddr { }Copy, #[automatically_derived]
#[doc(hidden)]
#[stable(feature = "rust1", since = "1.0.0")]
unsafe impl crate::clone::TrivialClone for SocketAddr { }
#[automatically_derived]
#[stable(feature = "rust1", since = "1.0.0")]
impl crate::clone::Clone for SocketAddr {
#[inline]
fn clone(&self) -> SocketAddr {
let _: crate::clone::AssertParamIsClone<SocketAddrV4>;
let _: crate::clone::AssertParamIsClone<SocketAddrV6>;
*self
}
}Clone, #[automatically_derived]
#[stable(feature = "rust1", since = "1.0.0")]
impl crate::marker::StructuralPartialEq for SocketAddr { }
#[automatically_derived]
#[stable(feature = "rust1", since = "1.0.0")]
impl crate::cmp::PartialEq for SocketAddr {
#[inline]
fn eq(&self, other: &SocketAddr) -> bool {
let __self_discr = crate::intrinsics::discriminant_value(self);
let __arg1_discr = crate::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(SocketAddr::V4(__self_0), SocketAddr::V4(__arg1_0)) =>
__self_0 == __arg1_0,
(SocketAddr::V6(__self_0), SocketAddr::V6(__arg1_0)) =>
__self_0 == __arg1_0,
_ => unsafe { crate::intrinsics::unreachable() }
}
}
}PartialEq, #[automatically_derived]
#[stable(feature = "rust1", since = "1.0.0")]
impl crate::cmp::Eq for SocketAddr {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: crate::cmp::AssertParamIsEq<SocketAddrV4>;
let _: crate::cmp::AssertParamIsEq<SocketAddrV6>;
}
}Eq, #[automatically_derived]
#[stable(feature = "rust1", since = "1.0.0")]
impl crate::hash::Hash for SocketAddr {
#[inline]
fn hash<__H: crate::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = crate::intrinsics::discriminant_value(self);
crate::hash::Hash::hash(&__self_discr, state);
match self {
SocketAddr::V4(__self_0) =>
crate::hash::Hash::hash(__self_0, state),
SocketAddr::V6(__self_0) =>
crate::hash::Hash::hash(__self_0, state),
}
}
}Hash, #[automatically_derived]
#[stable(feature = "rust1", since = "1.0.0")]
impl crate::cmp::PartialOrd for SocketAddr {
#[inline]
fn partial_cmp(&self, other: &SocketAddr)
-> crate::option::Option<crate::cmp::Ordering> {
crate::option::Option::Some(crate::cmp::Ord::cmp(self, other))
}
}PartialOrd, #[automatically_derived]
#[stable(feature = "rust1", since = "1.0.0")]
impl crate::cmp::Ord for SocketAddr {
#[inline]
fn cmp(&self, other: &SocketAddr) -> crate::cmp::Ordering {
let __self_discr = crate::intrinsics::discriminant_value(self);
let __arg1_discr = crate::intrinsics::discriminant_value(other);
match crate::cmp::Ord::cmp(&__self_discr, &__arg1_discr) {
crate::cmp::Ordering::Equal =>
match (self, other) {
(SocketAddr::V4(__self_0), SocketAddr::V4(__arg1_0)) =>
crate::cmp::Ord::cmp(__self_0, __arg1_0),
(SocketAddr::V6(__self_0), SocketAddr::V6(__arg1_0)) =>
crate::cmp::Ord::cmp(__self_0, __arg1_0),
_ => unsafe { crate::intrinsics::unreachable() }
},
cmp => cmp,
}
}
}Ord)]
32#[stable(feature = "rust1", since = "1.0.0")]
33pub enum SocketAddr {
34 #[stable(feature = "rust1", since = "1.0.0")]
36 V4(#[stable(feature = "rust1", since = "1.0.0")] SocketAddrV4),
37 #[stable(feature = "rust1", since = "1.0.0")]
39 V6(#[stable(feature = "rust1", since = "1.0.0")] SocketAddrV6),
40}
41
42#[derive(#[automatically_derived]
#[stable(feature = "rust1", since = "1.0.0")]
impl crate::marker::Copy for SocketAddrV4 { }Copy, #[automatically_derived]
#[doc(hidden)]
#[stable(feature = "rust1", since = "1.0.0")]
unsafe impl crate::clone::TrivialClone for SocketAddrV4 { }
#[automatically_derived]
#[stable(feature = "rust1", since = "1.0.0")]
impl crate::clone::Clone for SocketAddrV4 {
#[inline]
fn clone(&self) -> SocketAddrV4 {
let _: crate::clone::AssertParamIsClone<Ipv4Addr>;
let _: crate::clone::AssertParamIsClone<u16>;
*self
}
}Clone, #[automatically_derived]
#[stable(feature = "rust1", since = "1.0.0")]
impl crate::cmp::Eq for SocketAddrV4 {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: crate::cmp::AssertParamIsEq<Ipv4Addr>;
let _: crate::cmp::AssertParamIsEq<u16>;
}
}Eq, #[automatically_derived]
#[stable(feature = "rust1", since = "1.0.0")]
impl crate::marker::StructuralPartialEq for SocketAddrV4 { }
#[automatically_derived]
#[stable(feature = "rust1", since = "1.0.0")]
impl crate::cmp::PartialEq for SocketAddrV4 {
#[inline]
fn eq(&self, other: &SocketAddrV4) -> bool {
self.port == other.port && self.ip == other.ip
}
}PartialEq, #[automatically_derived]
#[stable(feature = "rust1", since = "1.0.0")]
impl crate::cmp::Ord for SocketAddrV4 {
#[inline]
fn cmp(&self, other: &SocketAddrV4) -> crate::cmp::Ordering {
match crate::cmp::Ord::cmp(&self.ip, &other.ip) {
crate::cmp::Ordering::Equal =>
crate::cmp::Ord::cmp(&self.port, &other.port),
cmp => cmp,
}
}
}Ord, #[automatically_derived]
#[stable(feature = "rust1", since = "1.0.0")]
impl crate::cmp::PartialOrd for SocketAddrV4 {
#[inline]
fn partial_cmp(&self, other: &SocketAddrV4)
-> crate::option::Option<crate::cmp::Ordering> {
crate::option::Option::Some(crate::cmp::Ord::cmp(self, other))
}
}PartialOrd, #[automatically_derived]
#[stable(feature = "rust1", since = "1.0.0")]
impl crate::hash::Hash for SocketAddrV4 {
#[inline]
fn hash<__H: crate::hash::Hasher>(&self, state: &mut __H) {
crate::hash::Hash::hash(&self.ip, state);
crate::hash::Hash::hash(&self.port, state)
}
}Hash)]
80#[stable(feature = "rust1", since = "1.0.0")]
81pub struct SocketAddrV4 {
82 ip: Ipv4Addr,
83 port: u16,
84}
85
86#[derive(#[automatically_derived]
#[stable(feature = "rust1", since = "1.0.0")]
impl crate::marker::Copy for SocketAddrV6 { }Copy, #[automatically_derived]
#[doc(hidden)]
#[stable(feature = "rust1", since = "1.0.0")]
unsafe impl crate::clone::TrivialClone for SocketAddrV6 { }
#[automatically_derived]
#[stable(feature = "rust1", since = "1.0.0")]
impl crate::clone::Clone for SocketAddrV6 {
#[inline]
fn clone(&self) -> SocketAddrV6 {
let _: crate::clone::AssertParamIsClone<Ipv6Addr>;
let _: crate::clone::AssertParamIsClone<u16>;
let _: crate::clone::AssertParamIsClone<u32>;
*self
}
}Clone, #[automatically_derived]
#[stable(feature = "rust1", since = "1.0.0")]
impl crate::cmp::Eq for SocketAddrV6 {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: crate::cmp::AssertParamIsEq<Ipv6Addr>;
let _: crate::cmp::AssertParamIsEq<u16>;
let _: crate::cmp::AssertParamIsEq<u32>;
}
}Eq, #[automatically_derived]
#[stable(feature = "rust1", since = "1.0.0")]
impl crate::marker::StructuralPartialEq for SocketAddrV6 { }
#[automatically_derived]
#[stable(feature = "rust1", since = "1.0.0")]
impl crate::cmp::PartialEq for SocketAddrV6 {
#[inline]
fn eq(&self, other: &SocketAddrV6) -> bool {
self.port == other.port && self.flowinfo == other.flowinfo &&
self.scope_id == other.scope_id && self.ip == other.ip
}
}PartialEq, #[automatically_derived]
#[stable(feature = "rust1", since = "1.0.0")]
impl crate::cmp::Ord for SocketAddrV6 {
#[inline]
fn cmp(&self, other: &SocketAddrV6) -> crate::cmp::Ordering {
match crate::cmp::Ord::cmp(&self.ip, &other.ip) {
crate::cmp::Ordering::Equal =>
match crate::cmp::Ord::cmp(&self.port, &other.port) {
crate::cmp::Ordering::Equal =>
match crate::cmp::Ord::cmp(&self.flowinfo, &other.flowinfo)
{
crate::cmp::Ordering::Equal =>
crate::cmp::Ord::cmp(&self.scope_id, &other.scope_id),
cmp => cmp,
},
cmp => cmp,
},
cmp => cmp,
}
}
}Ord, #[automatically_derived]
#[stable(feature = "rust1", since = "1.0.0")]
impl crate::cmp::PartialOrd for SocketAddrV6 {
#[inline]
fn partial_cmp(&self, other: &SocketAddrV6)
-> crate::option::Option<crate::cmp::Ordering> {
crate::option::Option::Some(crate::cmp::Ord::cmp(self, other))
}
}PartialOrd, #[automatically_derived]
#[stable(feature = "rust1", since = "1.0.0")]
impl crate::hash::Hash for SocketAddrV6 {
#[inline]
fn hash<__H: crate::hash::Hasher>(&self, state: &mut __H) {
crate::hash::Hash::hash(&self.ip, state);
crate::hash::Hash::hash(&self.port, state);
crate::hash::Hash::hash(&self.flowinfo, state);
crate::hash::Hash::hash(&self.scope_id, state)
}
}Hash)]
146#[stable(feature = "rust1", since = "1.0.0")]
147pub struct SocketAddrV6 {
148 ip: Ipv6Addr,
149 port: u16,
150 flowinfo: u32,
151 scope_id: u32,
152}
153
154impl SocketAddr {
155 #[stable(feature = "ip_addr", since = "1.7.0")]
169 #[must_use]
170 #[rustc_const_stable(feature = "const_socketaddr", since = "1.69.0")]
171 #[inline]
172 pub const fn new(ip: IpAddr, port: u16) -> SocketAddr {
173 match ip {
174 IpAddr::V4(a) => SocketAddr::V4(SocketAddrV4::new(a, port)),
175 IpAddr::V6(a) => SocketAddr::V6(SocketAddrV6::new(a, port, 0, 0)),
176 }
177 }
178
179 #[must_use]
190 #[stable(feature = "ip_addr", since = "1.7.0")]
191 #[rustc_const_stable(feature = "const_socketaddr", since = "1.69.0")]
192 #[inline]
193 pub const fn ip(&self) -> IpAddr {
194 match *self {
195 SocketAddr::V4(ref a) => IpAddr::V4(*a.ip()),
196 SocketAddr::V6(ref a) => IpAddr::V6(*a.ip()),
197 }
198 }
199
200 #[inline]
212 #[stable(feature = "sockaddr_setters", since = "1.9.0")]
213 #[rustc_const_stable(feature = "const_sockaddr_setters", since = "1.87.0")]
214 pub const fn set_ip(&mut self, new_ip: IpAddr) {
215 match (self, new_ip) {
217 (&mut SocketAddr::V4(ref mut a), IpAddr::V4(new_ip)) => a.set_ip(new_ip),
218 (&mut SocketAddr::V6(ref mut a), IpAddr::V6(new_ip)) => a.set_ip(new_ip),
219 (self_, new_ip) => *self_ = Self::new(new_ip, self_.port()),
220 }
221 }
222
223 #[must_use]
234 #[stable(feature = "rust1", since = "1.0.0")]
235 #[rustc_const_stable(feature = "const_socketaddr", since = "1.69.0")]
236 #[inline]
237 pub const fn port(&self) -> u16 {
238 match *self {
239 SocketAddr::V4(ref a) => a.port(),
240 SocketAddr::V6(ref a) => a.port(),
241 }
242 }
243
244 #[inline]
256 #[stable(feature = "sockaddr_setters", since = "1.9.0")]
257 #[rustc_const_stable(feature = "const_sockaddr_setters", since = "1.87.0")]
258 pub const fn set_port(&mut self, new_port: u16) {
259 match *self {
260 SocketAddr::V4(ref mut a) => a.set_port(new_port),
261 SocketAddr::V6(ref mut a) => a.set_port(new_port),
262 }
263 }
264
265 #[must_use]
281 #[stable(feature = "sockaddr_checker", since = "1.16.0")]
282 #[rustc_const_stable(feature = "const_socketaddr", since = "1.69.0")]
283 #[inline]
284 pub const fn is_ipv4(&self) -> bool {
285 #[allow(non_exhaustive_omitted_patterns)] match *self {
SocketAddr::V4(_) => true,
_ => false,
}matches!(*self, SocketAddr::V4(_))
286 }
287
288 #[must_use]
304 #[stable(feature = "sockaddr_checker", since = "1.16.0")]
305 #[rustc_const_stable(feature = "const_socketaddr", since = "1.69.0")]
306 #[inline]
307 pub const fn is_ipv6(&self) -> bool {
308 #[allow(non_exhaustive_omitted_patterns)] match *self {
SocketAddr::V6(_) => true,
_ => false,
}matches!(*self, SocketAddr::V6(_))
309 }
310
311 #[inline]
345 #[must_use]
346 #[unstable(feature = "addr_unspecified_from", issue = "158975")]
347 pub const fn unspecified_from(this: Self) -> Self {
348 match this {
349 Self::V4(_) => Self::V4(SocketAddrV4::new(Ipv4Addr::UNSPECIFIED, 0)),
350 Self::V6(addr) => Self::V6(SocketAddrV6::new(
351 Ipv6Addr::UNSPECIFIED,
352 0,
353 addr.flowinfo(),
354 addr.scope_id(),
355 )),
356 }
357 }
358}
359
360impl SocketAddrV4 {
361 #[stable(feature = "rust1", since = "1.0.0")]
373 #[must_use]
374 #[rustc_const_stable(feature = "const_socketaddr", since = "1.69.0")]
375 #[inline]
376 pub const fn new(ip: Ipv4Addr, port: u16) -> SocketAddrV4 {
377 SocketAddrV4 { ip, port }
378 }
379
380 #[must_use]
391 #[stable(feature = "rust1", since = "1.0.0")]
392 #[rustc_const_stable(feature = "const_socketaddr", since = "1.69.0")]
393 #[inline]
394 pub const fn ip(&self) -> &Ipv4Addr {
395 &self.ip
396 }
397
398 #[inline]
410 #[stable(feature = "sockaddr_setters", since = "1.9.0")]
411 #[rustc_const_stable(feature = "const_sockaddr_setters", since = "1.87.0")]
412 pub const fn set_ip(&mut self, new_ip: Ipv4Addr) {
413 self.ip = new_ip;
414 }
415
416 #[must_use]
427 #[stable(feature = "rust1", since = "1.0.0")]
428 #[rustc_const_stable(feature = "const_socketaddr", since = "1.69.0")]
429 #[inline]
430 pub const fn port(&self) -> u16 {
431 self.port
432 }
433
434 #[inline]
446 #[stable(feature = "sockaddr_setters", since = "1.9.0")]
447 #[rustc_const_stable(feature = "const_sockaddr_setters", since = "1.87.0")]
448 pub const fn set_port(&mut self, new_port: u16) {
449 self.port = new_port;
450 }
451}
452
453impl SocketAddrV6 {
454 #[stable(feature = "rust1", since = "1.0.0")]
471 #[must_use]
472 #[rustc_const_stable(feature = "const_socketaddr", since = "1.69.0")]
473 #[inline]
474 pub const fn new(ip: Ipv6Addr, port: u16, flowinfo: u32, scope_id: u32) -> SocketAddrV6 {
475 SocketAddrV6 { ip, port, flowinfo, scope_id }
476 }
477
478 #[must_use]
489 #[stable(feature = "rust1", since = "1.0.0")]
490 #[rustc_const_stable(feature = "const_socketaddr", since = "1.69.0")]
491 #[inline]
492 pub const fn ip(&self) -> &Ipv6Addr {
493 &self.ip
494 }
495
496 #[inline]
508 #[stable(feature = "sockaddr_setters", since = "1.9.0")]
509 #[rustc_const_stable(feature = "const_sockaddr_setters", since = "1.87.0")]
510 pub const fn set_ip(&mut self, new_ip: Ipv6Addr) {
511 self.ip = new_ip;
512 }
513
514 #[must_use]
525 #[stable(feature = "rust1", since = "1.0.0")]
526 #[rustc_const_stable(feature = "const_socketaddr", since = "1.69.0")]
527 #[inline]
528 pub const fn port(&self) -> u16 {
529 self.port
530 }
531
532 #[inline]
544 #[stable(feature = "sockaddr_setters", since = "1.9.0")]
545 #[rustc_const_stable(feature = "const_sockaddr_setters", since = "1.87.0")]
546 pub const fn set_port(&mut self, new_port: u16) {
547 self.port = new_port;
548 }
549
550 #[must_use]
571 #[stable(feature = "rust1", since = "1.0.0")]
572 #[rustc_const_stable(feature = "const_socketaddr", since = "1.69.0")]
573 #[inline]
574 pub const fn flowinfo(&self) -> u32 {
575 self.flowinfo
576 }
577
578 #[inline]
592 #[stable(feature = "sockaddr_setters", since = "1.9.0")]
593 #[rustc_const_stable(feature = "const_sockaddr_setters", since = "1.87.0")]
594 pub const fn set_flowinfo(&mut self, new_flowinfo: u32) {
595 self.flowinfo = new_flowinfo;
596 }
597
598 #[must_use]
614 #[stable(feature = "rust1", since = "1.0.0")]
615 #[rustc_const_stable(feature = "const_socketaddr", since = "1.69.0")]
616 #[inline]
617 pub const fn scope_id(&self) -> u32 {
618 self.scope_id
619 }
620
621 #[inline]
635 #[stable(feature = "sockaddr_setters", since = "1.9.0")]
636 #[rustc_const_stable(feature = "const_sockaddr_setters", since = "1.87.0")]
637 pub const fn set_scope_id(&mut self, new_scope_id: u32) {
638 self.scope_id = new_scope_id;
639 }
640}
641
642#[stable(feature = "ip_from_ip", since = "1.16.0")]
643#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
644const impl From<SocketAddrV4> for SocketAddr {
645 #[inline]
647 fn from(sock4: SocketAddrV4) -> SocketAddr {
648 SocketAddr::V4(sock4)
649 }
650}
651
652#[stable(feature = "ip_from_ip", since = "1.16.0")]
653#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
654const impl From<SocketAddrV6> for SocketAddr {
655 #[inline]
657 fn from(sock6: SocketAddrV6) -> SocketAddr {
658 SocketAddr::V6(sock6)
659 }
660}
661
662#[stable(feature = "addr_from_into_ip", since = "1.17.0")]
663#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
664const impl<I: [const] Into<IpAddr>> From<(I, u16)> for SocketAddr {
665 fn from(pieces: (I, u16)) -> SocketAddr {
672 SocketAddr::new(pieces.0.into(), pieces.1)
673 }
674}
675
676#[stable(feature = "rust1", since = "1.0.0")]
677impl fmt::Display for SocketAddr {
678 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
679 match *self {
680 SocketAddr::V4(ref a) => a.fmt(f),
681 SocketAddr::V6(ref a) => a.fmt(f),
682 }
683 }
684}
685
686#[stable(feature = "rust1", since = "1.0.0")]
687impl fmt::Debug for SocketAddr {
688 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
689 fmt::Display::fmt(self, fmt)
690 }
691}
692
693#[stable(feature = "rust1", since = "1.0.0")]
694impl fmt::Display for SocketAddrV4 {
695 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
696 if f.precision().is_none() && f.width().is_none() {
699 f.write_fmt(format_args!("{0}:{1}", self.ip(), self.port()))write!(f, "{}:{}", self.ip(), self.port())
700 } else {
701 const LONGEST_IPV4_SOCKET_ADDR: &str = "255.255.255.255:65535";
702
703 let mut buf = DisplayBuffer::buffer::<{ LONGEST_IPV4_SOCKET_ADDR.len() }>();
704 let mut buf = DisplayBuffer::new(&mut buf);
705 buf.write_fmt(format_args!("{0}:{1}", self.ip(), self.port()))write!(buf, "{}:{}", self.ip(), self.port()).unwrap();
707
708 f.pad(buf.as_str())
709 }
710 }
711}
712
713#[stable(feature = "rust1", since = "1.0.0")]
714impl fmt::Debug for SocketAddrV4 {
715 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
716 fmt::Display::fmt(self, fmt)
717 }
718}
719
720#[stable(feature = "rust1", since = "1.0.0")]
721impl fmt::Display for SocketAddrV6 {
722 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
723 if f.precision().is_none() && f.width().is_none() {
726 match self.scope_id() {
727 0 => f.write_fmt(format_args!("[{0}]:{1}", self.ip(), self.port()))write!(f, "[{}]:{}", self.ip(), self.port()),
728 scope_id => f.write_fmt(format_args!("[{0}%{1}]:{2}", self.ip(), scope_id, self.port()))write!(f, "[{}%{}]:{}", self.ip(), scope_id, self.port()),
729 }
730 } else {
731 const LONGEST_IPV6_SOCKET_ADDR: &str =
732 "[ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff%4294967295]:65535";
733
734 let mut buf = DisplayBuffer::buffer::<{ LONGEST_IPV6_SOCKET_ADDR.len() }>();
735 let mut buf = DisplayBuffer::new(&mut buf);
736 match self.scope_id() {
737 0 => buf.write_fmt(format_args!("[{0}]:{1}", self.ip(), self.port()))write!(buf, "[{}]:{}", self.ip(), self.port()),
738 scope_id => buf.write_fmt(format_args!("[{0}%{1}]:{2}", self.ip(), scope_id, self.port()))write!(buf, "[{}%{}]:{}", self.ip(), scope_id, self.port()),
739 }
740 .unwrap();
742
743 f.pad(buf.as_str())
744 }
745 }
746}
747
748#[stable(feature = "rust1", since = "1.0.0")]
749impl fmt::Debug for SocketAddrV6 {
750 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
751 fmt::Display::fmt(self, fmt)
752 }
753}