summaryrefslogtreecommitdiff
path: root/src/network/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/network/core')
-rw-r--r--src/network/core/address.cpp16
-rw-r--r--src/network/core/address.h23
-rw-r--r--src/network/core/tcp_connect.cpp7
3 files changed, 17 insertions, 29 deletions
diff --git a/src/network/core/address.cpp b/src/network/core/address.cpp
index a29640056..888625dc1 100644
--- a/src/network/core/address.cpp
+++ b/src/network/core/address.cpp
@@ -21,17 +21,6 @@ const char *NetworkAddress::GetHostname()
return this->hostname;
}
-uint32 NetworkAddress::GetIP()
-{
- assert(this->address.ss_family == AF_INET);
-
- if (!this->resolved) {
- ((struct sockaddr_in *)&this->address)->sin_addr.s_addr = NetworkResolveHost(this->hostname);
- this->resolved = true;
- }
- return ((struct sockaddr_in *)&this->address)->sin_addr.s_addr;
-}
-
uint16 NetworkAddress::GetPort() const
{
switch (this->address.ss_family) {
@@ -66,7 +55,10 @@ const char *NetworkAddress::GetAddressAsString()
const sockaddr_storage *NetworkAddress::GetAddress()
{
- if (!this->resolved) this->GetIP();
+ if (!this->resolved) {
+ ((struct sockaddr_in *)&this->address)->sin_addr.s_addr = NetworkResolveHost(this->hostname);
+ this->resolved = true;
+ }
return &this->address;
}
diff --git a/src/network/core/address.h b/src/network/core/address.h
index faa173493..3a4b8c06e 100644
--- a/src/network/core/address.h
+++ b/src/network/core/address.h
@@ -98,13 +98,6 @@ public:
const sockaddr_storage *GetAddress();
/**
- * Get the IP address. If the IP has not been resolved yet this will resolve
- * it possibly blocking this function for a while
- * @return the IP address
- */
- uint32 GetIP();
-
- /**
* Get the port
* @return the port
*/
@@ -131,12 +124,20 @@ public:
*/
bool operator == (NetworkAddress &address)
{
- if (this->IsResolved() != address.IsResolved()) return false;
-
- if (this->IsResolved()) return memcmp(&this->address, &address.address, sizeof(this->address)) == 0;
-
+ if (this->IsResolved() && address.IsResolved()) return memcmp(&this->address, &address.address, sizeof(this->address)) == 0;
return this->GetPort() == address.GetPort() && strcmp(this->GetHostname(), address.GetHostname()) == 0;
}
+
+ NetworkAddress& operator = (const NetworkAddress &other)
+ {
+ if (this != &other) { // protect against invalid self-assignment
+ free(this->hostname);
+ memcpy(this, &other, sizeof(*this));
+ if (other.hostname != NULL) this->hostname = strdup(other.hostname);
+ }
+ return *this;
+ }
+
};
#endif /* ENABLE_NETWORK */
diff --git a/src/network/core/tcp_connect.cpp b/src/network/core/tcp_connect.cpp
index 88501b260..a994fc6d2 100644
--- a/src/network/core/tcp_connect.cpp
+++ b/src/network/core/tcp_connect.cpp
@@ -41,13 +41,8 @@ void TCPConnecter::Connect()
if (!SetNoDelay(this->sock)) DEBUG(net, 1, "Setting TCP_NODELAY failed");
- struct sockaddr_in sin;
- sin.sin_family = AF_INET;
- sin.sin_addr.s_addr = address.GetIP();
- sin.sin_port = htons(address.GetPort());
-
/* We failed to connect for which reason what so ever */
- if (connect(this->sock, (struct sockaddr*) &sin, sizeof(sin)) != 0) {
+ if (connect(this->sock, (struct sockaddr*)this->address.GetAddress(), sizeof(*this->address.GetAddress())) != 0) {
closesocket(this->sock);
this->sock = INVALID_SOCKET;
this->aborted = true;