From 58054f460e6bb04d6fd28a881c0b010df778bf5d Mon Sep 17 00:00:00 2001 From: Hanjie Wu Date: Sat, 16 Dec 2023 01:13:23 -0800 Subject: add uTP support for outbound connections --- src/SocketCore.cc | 83 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 43 insertions(+), 40 deletions(-) (limited to 'src/SocketCore.cc') 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(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(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; } -- cgit