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]
#[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::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> {
let __self_discr = crate::intrinsics::discriminant_value(self);
let __arg1_discr = crate::intrinsics::discriminant_value(other);
match (self, other) {
(SocketAddr::V4(__self_0), SocketAddr::V4(__arg1_0)) =>
crate::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
(SocketAddr::V6(__self_0), SocketAddr::V6(__arg1_0)) =>
crate::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
_ =>
crate::cmp::PartialOrd::partial_cmp(&__self_discr,
&__arg1_discr),
}
}
}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]
#[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::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> {
match crate::cmp::PartialOrd::partial_cmp(&self.ip, &other.ip) {
crate::option::Option::Some(crate::cmp::Ordering::Equal) =>
crate::cmp::PartialOrd::partial_cmp(&self.port, &other.port),
cmp => cmp,
}
}
}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]
#[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::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> {
match crate::cmp::PartialOrd::partial_cmp(&self.ip, &other.ip) {
crate::option::Option::Some(crate::cmp::Ordering::Equal) =>
match crate::cmp::PartialOrd::partial_cmp(&self.port,
&other.port) {
crate::option::Option::Some(crate::cmp::Ordering::Equal) =>
match crate::cmp::PartialOrd::partial_cmp(&self.flowinfo,
&other.flowinfo) {
crate::option::Option::Some(crate::cmp::Ordering::Equal) =>
crate::cmp::PartialOrd::partial_cmp(&self.scope_id,
&other.scope_id),
cmp => cmp,
},
cmp => cmp,
},
cmp => cmp,
}
}
}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
312impl SocketAddrV4 {
313 #[stable(feature = "rust1", since = "1.0.0")]
325 #[must_use]
326 #[rustc_const_stable(feature = "const_socketaddr", since = "1.69.0")]
327 #[inline]
328 pub const fn new(ip: Ipv4Addr, port: u16) -> SocketAddrV4 {
329 SocketAddrV4 { ip, port }
330 }
331
332 #[must_use]
343 #[stable(feature = "rust1", since = "1.0.0")]
344 #[rustc_const_stable(feature = "const_socketaddr", since = "1.69.0")]
345 #[inline]
346 pub const fn ip(&self) -> &Ipv4Addr {
347 &self.ip
348 }
349
350 #[inline]
362 #[stable(feature = "sockaddr_setters", since = "1.9.0")]
363 #[rustc_const_stable(feature = "const_sockaddr_setters", since = "1.87.0")]
364 pub const fn set_ip(&mut self, new_ip: Ipv4Addr) {
365 self.ip = new_ip;
366 }
367
368 #[must_use]
379 #[stable(feature = "rust1", since = "1.0.0")]
380 #[rustc_const_stable(feature = "const_socketaddr", since = "1.69.0")]
381 #[inline]
382 pub const fn port(&self) -> u16 {
383 self.port
384 }
385
386 #[inline]
398 #[stable(feature = "sockaddr_setters", since = "1.9.0")]
399 #[rustc_const_stable(feature = "const_sockaddr_setters", since = "1.87.0")]
400 pub const fn set_port(&mut self, new_port: u16) {
401 self.port = new_port;
402 }
403}
404
405impl SocketAddrV6 {
406 #[stable(feature = "rust1", since = "1.0.0")]
423 #[must_use]
424 #[rustc_const_stable(feature = "const_socketaddr", since = "1.69.0")]
425 #[inline]
426 pub const fn new(ip: Ipv6Addr, port: u16, flowinfo: u32, scope_id: u32) -> SocketAddrV6 {
427 SocketAddrV6 { ip, port, flowinfo, scope_id }
428 }
429
430 #[must_use]
441 #[stable(feature = "rust1", since = "1.0.0")]
442 #[rustc_const_stable(feature = "const_socketaddr", since = "1.69.0")]
443 #[inline]
444 pub const fn ip(&self) -> &Ipv6Addr {
445 &self.ip
446 }
447
448 #[inline]
460 #[stable(feature = "sockaddr_setters", since = "1.9.0")]
461 #[rustc_const_stable(feature = "const_sockaddr_setters", since = "1.87.0")]
462 pub const fn set_ip(&mut self, new_ip: Ipv6Addr) {
463 self.ip = new_ip;
464 }
465
466 #[must_use]
477 #[stable(feature = "rust1", since = "1.0.0")]
478 #[rustc_const_stable(feature = "const_socketaddr", since = "1.69.0")]
479 #[inline]
480 pub const fn port(&self) -> u16 {
481 self.port
482 }
483
484 #[inline]
496 #[stable(feature = "sockaddr_setters", since = "1.9.0")]
497 #[rustc_const_stable(feature = "const_sockaddr_setters", since = "1.87.0")]
498 pub const fn set_port(&mut self, new_port: u16) {
499 self.port = new_port;
500 }
501
502 #[must_use]
523 #[stable(feature = "rust1", since = "1.0.0")]
524 #[rustc_const_stable(feature = "const_socketaddr", since = "1.69.0")]
525 #[inline]
526 pub const fn flowinfo(&self) -> u32 {
527 self.flowinfo
528 }
529
530 #[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_flowinfo(&mut self, new_flowinfo: u32) {
547 self.flowinfo = new_flowinfo;
548 }
549
550 #[must_use]
566 #[stable(feature = "rust1", since = "1.0.0")]
567 #[rustc_const_stable(feature = "const_socketaddr", since = "1.69.0")]
568 #[inline]
569 pub const fn scope_id(&self) -> u32 {
570 self.scope_id
571 }
572
573 #[inline]
587 #[stable(feature = "sockaddr_setters", since = "1.9.0")]
588 #[rustc_const_stable(feature = "const_sockaddr_setters", since = "1.87.0")]
589 pub const fn set_scope_id(&mut self, new_scope_id: u32) {
590 self.scope_id = new_scope_id;
591 }
592}
593
594#[stable(feature = "ip_from_ip", since = "1.16.0")]
595#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
596impl const From<SocketAddrV4> for SocketAddr {
597 #[inline]
599 fn from(sock4: SocketAddrV4) -> SocketAddr {
600 SocketAddr::V4(sock4)
601 }
602}
603
604#[stable(feature = "ip_from_ip", since = "1.16.0")]
605#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
606impl const From<SocketAddrV6> for SocketAddr {
607 #[inline]
609 fn from(sock6: SocketAddrV6) -> SocketAddr {
610 SocketAddr::V6(sock6)
611 }
612}
613
614#[stable(feature = "addr_from_into_ip", since = "1.17.0")]
615#[rustc_const_unstable(feature = "const_convert", issue = "143773")]
616impl<I: [const] Into<IpAddr>> const From<(I, u16)> for SocketAddr {
617 fn from(pieces: (I, u16)) -> SocketAddr {
624 SocketAddr::new(pieces.0.into(), pieces.1)
625 }
626}
627
628#[stable(feature = "rust1", since = "1.0.0")]
629impl fmt::Display for SocketAddr {
630 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
631 match *self {
632 SocketAddr::V4(ref a) => a.fmt(f),
633 SocketAddr::V6(ref a) => a.fmt(f),
634 }
635 }
636}
637
638#[stable(feature = "rust1", since = "1.0.0")]
639impl fmt::Debug for SocketAddr {
640 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
641 fmt::Display::fmt(self, fmt)
642 }
643}
644
645#[stable(feature = "rust1", since = "1.0.0")]
646impl fmt::Display for SocketAddrV4 {
647 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
648 if f.precision().is_none() && f.width().is_none() {
651 f.write_fmt(format_args!("{0}:{1}", self.ip(), self.port()))write!(f, "{}:{}", self.ip(), self.port())
652 } else {
653 const LONGEST_IPV4_SOCKET_ADDR: &str = "255.255.255.255:65535";
654
655 let mut buf = DisplayBuffer::<{ LONGEST_IPV4_SOCKET_ADDR.len() }>::new();
656 buf.write_fmt(format_args!("{0}:{1}", self.ip(), self.port()))write!(buf, "{}:{}", self.ip(), self.port()).unwrap();
658
659 f.pad(buf.as_str())
660 }
661 }
662}
663
664#[stable(feature = "rust1", since = "1.0.0")]
665impl fmt::Debug for SocketAddrV4 {
666 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
667 fmt::Display::fmt(self, fmt)
668 }
669}
670
671#[stable(feature = "rust1", since = "1.0.0")]
672impl fmt::Display for SocketAddrV6 {
673 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
674 if f.precision().is_none() && f.width().is_none() {
677 match self.scope_id() {
678 0 => f.write_fmt(format_args!("[{0}]:{1}", self.ip(), self.port()))write!(f, "[{}]:{}", self.ip(), self.port()),
679 scope_id => f.write_fmt(format_args!("[{0}%{1}]:{2}", self.ip(), scope_id, self.port()))write!(f, "[{}%{}]:{}", self.ip(), scope_id, self.port()),
680 }
681 } else {
682 const LONGEST_IPV6_SOCKET_ADDR: &str =
683 "[ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff%4294967295]:65535";
684
685 let mut buf = DisplayBuffer::<{ LONGEST_IPV6_SOCKET_ADDR.len() }>::new();
686 match self.scope_id() {
687 0 => buf.write_fmt(format_args!("[{0}]:{1}", self.ip(), self.port()))write!(buf, "[{}]:{}", self.ip(), self.port()),
688 scope_id => buf.write_fmt(format_args!("[{0}%{1}]:{2}", self.ip(), scope_id, self.port()))write!(buf, "[{}%{}]:{}", self.ip(), scope_id, self.port()),
689 }
690 .unwrap();
692
693 f.pad(buf.as_str())
694 }
695 }
696}
697
698#[stable(feature = "rust1", since = "1.0.0")]
699impl fmt::Debug for SocketAddrV6 {
700 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
701 fmt::Display::fmt(self, fmt)
702 }
703}