summaryrefslogtreecommitdiff
path: root/src/SocketCore.cc
diff options
context:
space:
mode:
authorHanjie Wu <wu@x-nagi.com>2023-12-16 01:13:23 -0800
committerHanjie Wu <wu@x-nagi.com>2023-12-16 01:13:23 -0800
commit58054f460e6bb04d6fd28a881c0b010df778bf5d (patch)
tree1ee1b9297f6a891155dc7b5deeda103e400bb6c6 /src/SocketCore.cc
parent5c87f1b7b6345b895caf9f9b29a2c3c7ca94a0af (diff)
add uTP support for outbound connections
Diffstat (limited to 'src/SocketCore.cc')
-rw-r--r--src/SocketCore.cc83
1 files changed, 43 insertions, 40 deletions
diff --git a/src/SocketCore.cc b/src/SocketCore.cc
index 4e7421bc..37f6b397 100644
--- a/src/SocketCore.cc
+++ b/src/SocketCore.cc
@@ -68,38 +68,6 @@
namespace aria2 {
-#ifndef __MINGW32__
-# define SOCKET_ERRNO (errno)
-#else
-# define SOCKET_ERRNO (WSAGetLastError())
-#endif // __MINGW32__
-
-#ifdef __MINGW32__
-# define A2_EINPROGRESS WSAEWOULDBLOCK
-# define A2_EWOULDBLOCK WSAEWOULDBLOCK
-# define A2_EINTR WSAEINTR
-# define A2_WOULDBLOCK(e) (e == WSAEWOULDBLOCK)
-#else // !__MINGW32__
-# define A2_EINPROGRESS EINPROGRESS
-# ifndef EWOULDBLOCK
-# define EWOULDBLOCK EAGAIN
-# endif // EWOULDBLOCK
-# define A2_EWOULDBLOCK EWOULDBLOCK
-# define A2_EINTR EINTR
-# if EWOULDBLOCK == EAGAIN
-# define A2_WOULDBLOCK(e) (e == EWOULDBLOCK)
-# else // EWOULDBLOCK != EAGAIN
-# define A2_WOULDBLOCK(e) (e == EWOULDBLOCK || e == EAGAIN)
-# endif // EWOULDBLOCK != EAGAIN
-#endif // !__MINGW32__
-
-#ifdef __MINGW32__
-# define CLOSE(X) ::closesocket(X)
-#else
-# define CLOSE(X) close(X)
-#endif // __MINGW32__
-
-namespace {
std::string errorMsg(int errNum)
{
#ifndef __MINGW32__
@@ -114,7 +82,6 @@ std::string errorMsg(int errNum)
return msg;
#endif // __MINGW32__
}
-} // namespace
namespace {
enum TlsState {
@@ -417,11 +384,16 @@ Endpoint SocketCore::getPeerInfo() const
{
sockaddr_union sockaddr;
socklen_t len = sizeof(sockaddr);
+ getPeerInfo(sockaddr, len);
+ return util::getNumericNameInfo(&sockaddr.sa, len);
+}
+
+void SocketCore::getPeerInfo(sockaddr_union& sockaddr, socklen_t& len) const
+{
if (getpeername(sockfd_, &sockaddr.sa, &len) == -1) {
int errNum = SOCKET_ERRNO;
throw DL_ABORT_EX(fmt(EX_SOCKET_GET_NAME, errorMsg(errNum).c_str()));
}
- return util::getNumericNameInfo(&sockaddr.sa, len);
}
void SocketCore::establishConnection(const std::string& host, uint16_t port,
@@ -488,7 +460,7 @@ void SocketCore::establishConnection(const std::string& host, uint16_t port,
sockfd_ = fd;
// make socket non-blocking mode
setNonBlockingMode();
- if (tcpNodelay) {
+ if (sockType_ == SOCK_STREAM && tcpNodelay) {
setTcpNodelay(true);
}
if (connect(fd, rp->ai_addr, rp->ai_addrlen) == -1 &&
@@ -1226,13 +1198,48 @@ ssize_t SocketCore::writeData(const void* data, size_t len,
return r;
}
-ssize_t SocketCore::readDataFrom(void* data, size_t len, Endpoint& sender)
+ssize_t SocketCore::writeData(const void* data, size_t len,
+ const sockaddr* addr, socklen_t socklen,
+ int flags)
{
wantRead_ = false;
wantWrite_ = false;
+ ssize_t r = -1;
+ int errNum = 0;
+ while ((r = sendto(sockfd_, reinterpret_cast<const char*>(data), len, flags,
+ addr, socklen)) == -1 &&
+ A2_EINTR == SOCKET_ERRNO)
+ ;
+ errNum = SOCKET_ERRNO;
+ if (r == -1) {
+ if (A2_WOULDBLOCK(errNum)) {
+ wantWrite_ = true;
+ return 0;
+ }
+ throw DL_ABORT_EX(fmt(EX_SOCKET_SEND, errorMsg(errNum).c_str()));
+ }
+ return r;
+}
+
+ssize_t SocketCore::readDataFrom(void* data, size_t len, Endpoint& sender)
+{
sockaddr_union sockaddr;
socklen_t sockaddrlen = sizeof(sockaddr);
ssize_t r;
+ r = readDataFrom(data, len, sockaddr, sockaddrlen);
+ if (r != -1) {
+ sender = util::getNumericNameInfo(&sockaddr.sa, sockaddrlen);
+ }
+ return r;
+}
+
+ssize_t SocketCore::readDataFrom(void* data, size_t len,
+ sockaddr_union& sockaddr,
+ socklen_t& sockaddrlen)
+{
+ wantRead_ = false;
+ wantWrite_ = false;
+ ssize_t r;
// Cast for Windows recvfrom()
while ((r = recvfrom(sockfd_, reinterpret_cast<char*>(data), len, 0,
&sockaddr.sa, &sockaddrlen)) == -1 &&
@@ -1246,10 +1253,6 @@ ssize_t SocketCore::readDataFrom(void* data, size_t len, Endpoint& sender)
wantRead_ = true;
r = 0;
}
- else {
- sender = util::getNumericNameInfo(&sockaddr.sa, sockaddrlen);
- }
-
return r;
}