net/StaticSocketAddress: add method SetPort()

This commit is contained in:
Max Kellermann 2017-05-17 12:03:45 +02:00
parent e6e9b2041e
commit a8db9ae304
2 changed files with 52 additions and 2 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2012-2015 Max Kellermann <max.kellermann@gmail.com>
* Copyright (C) 2012-2017 Max Kellermann <max.kellermann@gmail.com>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@ -34,6 +34,14 @@
#include <string.h>
#ifdef HAVE_TCP
#ifdef WIN32
#include <ws2tcpip.h>
#else
#include <netinet/in.h>
#endif
#endif
StaticSocketAddress &
StaticSocketAddress::operator=(SocketAddress other) noexcept
{
@ -41,3 +49,29 @@ StaticSocketAddress::operator=(SocketAddress other) noexcept
memcpy(&address, other.GetAddress(), size);
return *this;
}
#ifdef HAVE_TCP
bool
StaticSocketAddress::SetPort(unsigned port)
{
switch (GetFamily()) {
case AF_INET:
{
auto &a = (struct sockaddr_in &)address;
a.sin_port = htons(port);
return true;
}
case AF_INET6:
{
auto &a = (struct sockaddr_in6 &)address;
a.sin6_port = htons(port);
return true;
}
}
return false;
}
#endif

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2012-2015 Max Kellermann <max.kellermann@gmail.com>
* Copyright (C) 2012-2017 Max Kellermann <max.kellermann@gmail.com>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@ -91,6 +91,22 @@ public:
address.ss_family = AF_UNSPEC;
}
#ifdef HAVE_TCP
/**
* Extract the port number. Returns 0 if not applicable.
*/
gcc_pure
unsigned GetPort() const {
return ((SocketAddress)*this).GetPort();
}
/**
* @return true on success, false if this address cannot have
* a port number
*/
bool SetPort(unsigned port);
#endif
gcc_pure
bool operator==(SocketAddress other) const {
return (SocketAddress)*this == other;