45 #ifndef CCXX_SOCKET_H_
46 #define CCXX_SOCKET_H_
48 #ifndef CCXX_ADDRESS_H_
52 #if defined(WIN32) && !defined(__CYGWIN32__)
54 #define _IOLEN64 (unsigned)
55 #define _IORET64 (int)
56 #define TIMEOUT_INF ~((timeout_t) 0)
57 typedef int socklen_t;
59 #define INVALID_SOCKET -1
72 #define MSG_DONTWAIT 0
76 #define MSG_NOSIGNAL 0
83 #define IPPROTO_DCCP 33
88 #define DCCP_SOCKOPT_AVAILABLE_CCIDS 12
89 #define DCCP_SOCKOPT_CCID 13
90 #define DCCP_SOCKOPT_TX_CCID 14
91 #define DCCP_SOCKOPT_RX_CCID 15
93 #ifdef CCXX_NAMESPACES
195 mutable const char *errstr;
198 void setSocket(
void);
240 inline void error(
const char *err)
const
241 {
error(errExtended, err);};
250 {flags.thrown = !enable;};
257 void endSocket(
void);
264 Error connectError(
void);
269 Error sendLimit(
int limit = 2048);
274 Error receiveLimit(
int limit = 1);
299 Error sendBuffer(
unsigned size);
308 Error receiveBuffer(
unsigned size);
317 Error bufferSize(
unsigned size);
327 Error setBroadcast(
bool enable);
340 Error setMulticastByFamily(
bool enable, Family family = IPV4);
350 Error setLoopbackByFamily(
bool enable, Family family = IPV4);
359 Error setTimeToLiveByFamily(
unsigned char ttl, Family fam = IPV4);
390 Error setRouting(
bool enable);
399 Error setNoDelay(
bool enable);
412 Socket(
int domain,
int type,
int protocol = 0);
446 ssize_t readLine(
char *buf,
size_t len,
timeout_t timeout = 0);
459 virtual ssize_t readData(
void * buf,
size_t len,
char separator=0,
timeout_t t=0);
469 virtual ssize_t writeData(
const void* buf,
size_t len,
timeout_t t=0);
487 static bool check(Family fam);
506 {
return getIPV4Sender(port);}
524 {
return getIPV4Peer(port);}
540 {
return getIPV4Local(port);}
576 {
return getIPV4NAT(port);}
592 void setCompletion(
bool immediate);
599 Error setLinger(
bool linger);
608 Error setKeepAlive(
bool enable);
618 Error setTypeOfService(Tos service);
628 bool isConnected(
void)
const;
637 bool isActive(
void)
const;
643 bool operator!()
const;
652 {
return flags.broadcast;};
660 {
return flags.route;};
680 const char *getSystemErrorString(
void)
const;
723 struct sockaddr_in ipv4;
725 struct sockaddr_in6 ipv6;
779 DCCPSocket(
const char *name, Family family = IPV4,
unsigned backlog = 5);
799 void disconnect(
void);
804 bool setCCID(
uint8 ccid);
836 void connect(
const char *name);
887 inline Error setKeepAlive(
bool enable)
893 struct sockaddr_in6 ipv6;
894 struct sockaddr_in ipv4;
898 struct sockaddr_in ipv4;
913 UDPSocket(
const char *name, Family family = IPV4);
973 Socket::Error getInterfaceIndex(
const char *ethX,
int& InterfaceIndex);
993 ssize_t send(
const void *buf,
size_t len);
1003 ssize_t receive(
void *buf,
size_t len,
bool reply =
false);
1015 {
return getIPV4Peer(port);}
1028 inline ssize_t
peek(
void *buf,
size_t len)
1029 {
return _IORET64 ::recv(so, (
char *)buf,
_IOLEN64 len, MSG_PEEK);};
1034 void setPeer(
const char *service);
1035 void connect(
const char *service);
1041 Error disconnect(
void);
1058 Error setBroadcast(
bool enable)
1165 inline ssize_t
send(
const void *buf,
size_t len)
1198 inline ssize_t
transmit(
const char *buffer,
size_t len)
1310 {
return _IORET64 ::recv(so, (
char *)buf,
_IOLEN64 len, 0);};
1367 Error disconnect(
void);
1399 void setSegmentSize(
unsigned mss);
1451 TCPSocket(
const char *name,
unsigned backlog = 5,
unsigned mss = 536);
1518 void setSegmentSize(
unsigned mss);
1567 TCPV6Socket(
const char *name,
unsigned backlog = 5,
unsigned mss = 536);
1615 #pragma warning(disable:4275) // disable C4275 warning
1636 void segmentBuffering(
unsigned mss);
1657 void disconnect(
void);
1662 int getSegmentSize(
void);
1671 void allocate(
size_t size);
1677 void endStream(
void);
1704 int overflow(
int ch);
1726 void connect(
const char *name,
unsigned mss = 536);
1736 {
return ((std::iostream *)
this);};
1787 TCPStream(
const char *name, Family family = IPV4,
unsigned mss = 536,
bool throwflag =
false,
timeout_t timer = 0);
1819 #ifdef HAVE_SNPRINTF
1826 size_t printf(
const char *format, ...);
1845 inline ssize_t
peek(
void *buf,
size_t len)
1846 {
return _IORET64 ::recv(so, (
char *)buf,
_IOLEN64 len, MSG_PEEK);};
1906 tpport_t port,
size_t size = 536,
int pri = 0,
size_t stack = 0);
1909 tpport_t port,
size_t size = 536,
int pri = 0,
size_t stack = 0);
1982 void endStream(
void);
2055 ssize_t read(
char *bytes,
size_t length,
timeout_t timeout = 0);
2068 ssize_t write(
const char *bytes,
size_t length,
timeout_t timeout = 0);
2083 ssize_t peek(
char *bytes,
size_t length,
timeout_t timeout = 0);
2087 #ifdef COMMON_STD_EXCEPTION
2088 class __EXPORT SockException :
public IOException
2094 SockException(
const String &str,
Socket::Error socketError,
long systemError = 0) :
2095 IOException(str, systemError), _socketError(socketError) {};
2098 {
return _socketError; }
2102 #ifdef CCXX_NAMESPACES