11 #ifndef gnatsocket_hpp
12 #define gnatsocket_hpp
16 # include <winsock2.h>
18 # define SOCKDATA char
20 # include <sys/types.h>
21 # include <sys/socket.h>
23 # define SOCKADDR struct sockaddr
24 # define SOCKADDR_IN struct sockaddr_in
25 # define SOCKSIZE ssize_t
26 # define SOCKDATA void
27 # define INVALID_SOCKET -1
31 #if defined(MSG_NOSIGNAL)
32 # define NO_SIGPIPE_(flags) (flags | MSG_NOSIGNAL)
34 # define NO_SIGPIPE_(flags) (flags)
50 enum Errors { Failed = -1, InvalidSocket = -2, UnknownHost = -3 };
68 static void cleanup();
75 int connect(
const std::string& host,
int port);
84 int bind(
const std::string& host,
int port);
90 bool isClosed()
const {
return sockfd_ == INVALID_SOCKET; }
106 SOCKSIZE
send(
const SOCKDATA* buf,
size_t len,
int flags = 0) {
107 return ::send(sockfd_, buf, len, NO_SIGPIPE_(flags));
115 SOCKSIZE
receive(SOCKDATA* buf,
size_t len,
int flags = 0) {
116 return ::recv(sockfd_, buf, len, flags);
122 SOCKSIZE
sendTo(
void const* buf,
size_t len,
int flags,
123 SOCKADDR
const* to, socklen_t addrlen) {
124 return ::sendto(sockfd_, buf, len, NO_SIGPIPE_(flags), to, addrlen);
129 SOCKADDR* from, socklen_t* addrlen) {
130 return ::recvfrom(sockfd_, buf, len, flags, from, addrlen);
172 friend class ServerSocket;
175 int setLocalAddress(SOCKADDR_IN& addr,
int port);
178 int setAddress(SOCKADDR_IN& addr,
const std::string& host,
int port);
205 int bind(
int port,
int backlog = 50);
211 bool isClosed()
const {
return sockfd_ == INVALID_SOCKET; }
299 SOCKSIZE
readLine(std::string& message);
308 SOCKSIZE
writeLine(
const std::string& message);
312 SOCKSIZE
read(
char* buffer,
size_t len);
316 SOCKSIZE
write(
const char* str,
size_t len);
327 int readSeparator()
const {
return insep_; }
336 int writeSeparator()
const {
return outsep_; }
345 bool retrieveLine(std::string& str, SOCKSIZE received);
346 size_t insize_{}, outsize_{};
347 int insep_{}, outsep_{};
349 struct InputBuffer* in_{};