diff options
| author | Matthias P. Braendli <matthias.braendli@mpb.li> | 2019-09-23 20:09:39 +0200 | 
|---|---|---|
| committer | Matthias P. Braendli <matthias.braendli@mpb.li> | 2019-09-23 20:09:39 +0200 | 
| commit | 09e514732788d821189c59ddc58e70355ba1a3cb (patch) | |
| tree | d7adc353859aa7f796bda0b4be12421f69779e73 /lib/Socket.cpp | |
| parent | 56ad3cdd13e4c0078329ede5781bae4fcaeed569 (diff) | |
| download | ODR-SourceCompanion-09e514732788d821189c59ddc58e70355ba1a3cb.tar.gz ODR-SourceCompanion-09e514732788d821189c59ddc58e70355ba1a3cb.tar.bz2 ODR-SourceCompanion-09e514732788d821189c59ddc58e70355ba1a3cb.zip | |
Add code from common repository
Diffstat (limited to 'lib/Socket.cpp')
| -rw-r--r-- | lib/Socket.cpp | 30 | 
1 files changed, 17 insertions, 13 deletions
| diff --git a/lib/Socket.cpp b/lib/Socket.cpp index cd70a8e..0c3cbb4 100644 --- a/lib/Socket.cpp +++ b/lib/Socket.cpp @@ -381,7 +381,7 @@ bool TCPSocket::valid() const      return m_sock != -1;  } -void TCPSocket::connect(const std::string& hostname, int port) +void TCPSocket::connect(const std::string& hostname, int port, bool nonblock)  {      if (m_sock != INVALID_SOCKET) {          throw std::logic_error("You may only connect an invalid TCPSocket"); @@ -415,10 +415,21 @@ void TCPSocket::connect(const std::string& hostname, int port)          if (sfd == -1)              continue; +        if (nonblock) { +            int flags = fcntl(sfd, F_GETFL); +            if (flags == -1) { +                std::string errstr(strerror(errno)); +                throw std::runtime_error("TCP: Could not get socket flags: " + errstr); +            } + +            if (fcntl(sfd, F_SETFL, flags | O_NONBLOCK) == -1) { +                std::string errstr(strerror(errno)); +                throw std::runtime_error("TCP: Could not set O_NONBLOCK: " + errstr); +            } +        } +          int ret = ::connect(sfd, rp->ai_addr, rp->ai_addrlen);          if (ret != -1 or (ret == -1 and errno == EINPROGRESS)) { -            // As the TCPClient could set the socket to nonblocking, we -            // must handle EINPROGRESS here              m_sock = sfd;              break;          } @@ -673,9 +684,6 @@ ssize_t TCPClient::recv(void *buffer, size_t length, int flags, int timeout_ms)          if (ret == 0) {              m_sock.close(); - -            TCPSocket newsock; -            m_sock = std::move(newsock);              reconnect();          } @@ -693,13 +701,9 @@ ssize_t TCPClient::recv(void *buffer, size_t length, int flags, int timeout_ms)  void TCPClient::reconnect()  { -    int flags = fcntl(m_sock.m_sock, F_GETFL); -    if (fcntl(m_sock.m_sock, F_SETFL, flags | O_NONBLOCK) == -1) { -        std::string errstr(strerror(errno)); -        throw std::runtime_error("TCP: Could not set O_NONBLOCK: " + errstr); -    } - -    m_sock.connect(m_hostname, m_port); +    TCPSocket newsock; +    m_sock = std::move(newsock); +    m_sock.connect(m_hostname, m_port, true);  }  TCPConnection::TCPConnection(TCPSocket&& sock) : | 
