From 7c27370e4f3478ffc7a1b96683c5c075ed50d99d Mon Sep 17 00:00:00 2001 From: JustinAJ Date: Mon, 25 May 2015 08:15:44 -0400 Subject: [PATCH] Improved Socket::accept(): * Now strictly uses IP-version-abstract functions again. * Should (again) be future proof (though at a slight hit in performance). --- Jupiter/Socket.cpp | 16 +++------------- Release/Jupiter.lib | Bin 267778 -> 267778 bytes 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/Jupiter/Socket.cpp b/Jupiter/Socket.cpp index aefdd9d..a1a347c 100644 --- a/Jupiter/Socket.cpp +++ b/Jupiter/Socket.cpp @@ -360,24 +360,14 @@ Jupiter::Socket *Jupiter::Socket::accept() if (tSock != INVALID_SOCKET) { char resolved[NI_MAXHOST]; - getnameinfo(&addr, size, resolved, NI_MAXHOST, 0, 0, NI_NUMERICHOST); + char resolved_port[NI_MAXSERV]; + getnameinfo(&addr, size, resolved, sizeof(resolved), resolved_port, sizeof(resolved_port), NI_NUMERICHOST | NI_NUMERICSERV); Socket *r = new Socket(Jupiter::Socket::data_->bufflen); r->data_->rawSock = tSock; r->data_->sockType = Jupiter::Socket::data_->sockType; r->data_->sockProto = Jupiter::Socket::data_->sockProto; r->data_->host.set(resolved); - switch (addr.sa_family) - { - case AF_INET: - r->data_->port = ntohs(reinterpret_cast(&addr)->sin_port); - break; - case AF_INET6: - r->data_->port = ntohs(reinterpret_cast(&addr)->sin6_port); - break; - default: - r->data_->port = 0x00000000; - break; - } + r->data_->port = Jupiter_strtoi(resolved_port, 10); return r; } return nullptr; diff --git a/Release/Jupiter.lib b/Release/Jupiter.lib index 4e13af1b2d8f0f75a403264f5c346680c1332bc4..dc39e41a77e72eb4ee24ba0160e751cd2c673b7b 100644 GIT binary patch delta 19368 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 hu|RcWd!PbCTigEzLs8NC0d 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 b1%|e?xC%qjG5QN&nHd8tx}{IYcoP2)hxs5e