36 int flags_before = ::fcntl(
m_socket, F_GETFL, 0);
39 ::fcntl(
m_socket, F_SETFL, flags_before | O_NONBLOCK);
44 { ret = 1;
goto exit; }
47 if( (errno != EWOULDBLOCK) && (errno != EINPROGRESS))
48 { ret = -1;
goto exit; }
53 poll.events = POLLOUT;
57 if( ret < 0)
goto exit;
64 int error = 0; socklen_t
len =
sizeof(error);
65 int opt = ::getsockopt(
m_socket, SOL_SOCKET, SO_ERROR, &error, &
len);
66 if( opt == 0) errno = error;
67 if( error != 0) ret = -1;
72 ::fcntl(
m_socket, F_SETFL, flags_before);
85 addr.sin_family = AF_INET;
86 addr.sin_addr.s_addr = INADDR_ANY;
87 addr.sin_port = htons(localPort);
105 socklen_t addr_len =
sizeof(addr);
107 if( getsockname(
m_socket, (sockaddr*) &addr, &addr_len) < 0)
110 return inet_ntoa( addr.sin_addr);
116 socklen_t addr_len =
sizeof(addr);
118 if( getsockname(
m_socket, (sockaddr*) &addr, &addr_len) < 0)
121 return ntohs( addr.sin_port);
127 socklen_t addr_len =
sizeof(addr);
129 if( getpeername(
m_socket, (sockaddr*) &addr, &addr_len) < 0)
130 throw SocketException(
"Fetch of foreign address failed (getpeername)");
132 return inet_ntoa( addr.sin_addr);
138 socklen_t addr_len =
sizeof(addr);
140 if( getpeername(
m_socket, (sockaddr*) &addr, &addr_len) < 0)
143 return ntohs( addr.sin_port);
148 const int IP_MAXSIZE = 20;
149 const int len = address.length();
152 if(
len >= IP_MAXSIZE)
155 addr.sin_family = AF_INET;
156 addr.sin_port = htons(port);
158 char buf[IP_MAXSIZE];
159 std::memcpy( buf, address.data(),
len);
162 if( inet_aton( buf, &addr.sin_addr) == 0)
#define TEMP_FAILURE_RETRY(expression)
void bind(unsigned short localPort=0)
unsigned short getLocalPort() const
unsigned short getForeignPort() const
InternetSocket(int sockfd)
create socket from a SocketHandle returned by an accept() call
int timedConnect(std::string_view foreignAddress, unsigned short foreignPort, int timeout)
establish a connection with the given foreign address and port
void connect(std::string_view foreignAddress, unsigned short foreignPort)
establish a connection with the given foreign address and port
std::string getLocalAddress() const
std::string getForeignAddress() const
static void fillAddress(std::string_view address, unsigned short port, sockaddr_in &addr)
int connect(const std::vector< std::string > &foreignAddresses, unsigned short foreignPort=0)
Signals a problem with the execution of a socket call.
SimpleSocket(int sockfd)
enables return of an accepted socket