rllib  1
Public Types | Public Member Functions | Static Public Member Functions | Public Attributes | Private Attributes | List of all members
rlSocket Class Reference

#include <rlsocket.h>

Inheritance diagram for rlSocket:
Inheritance graph
[legend]

Public Types

enum  SocketEnum {
  SOCKET_ERR = -1, SETSOCKOPT_ERR = -2, LISTEN_ERR = -3, ACCEPT_ERR = -4,
  INET_ADDR_ERR = -5, CONNECT_ERR = -6, PORT_ERR = -7
}
 

Public Member Functions

 rlSocket (const char *adr, int port, int active)
 
 rlSocket (int socket)
 
virtual ~rlSocket ()
 
void setAdr (const char *adr)
 
void setPort (int port)
 
int getPort ()
 
void setActive (int active)
 
int read (void *buf, int len, int timeout=0)
 
int readStr (char *buf, int len, int timeout=0)
 
int readHttpHeader (rlString *header, int timeout=0)
 
int write (const void *buf, int len)
 
int printf (const char *format,...)
 
int connect ()
 
int disconnect ()
 
int select (int timeout=0)
 
int isConnected ()
 
int setIPVersion (int version)
 
int getIPVersion ()
 
int sendProcessViewBrowserButtonEvent (int id)
 
int rlGetsockopt (int level, int optname)
 
int rlSetsockopt (int level, int optname)
 
int readHttpContentLength (int timeout)
 

Static Public Member Functions

static int rlGetsockopt (int sockfd, int level, int optname, void *optval, int *optlen)
 
static int rlSetsockopt (int sockfd, int level, int optname, const void *optval, int optlen)
 

Public Attributes

int s
 
unsigned char sockaddr [16+48]
 

Private Attributes

char adr [132]
 
int port
 
int active
 
int os
 
int first
 
int prefer_ipv6
 
int rl_ipversion
 

Detailed Description

class for encapsulating TCP/IP socket calls

Definition at line 46 of file rlsocket.h.

Member Enumeration Documentation

◆ SocketEnum

Enumerator
SOCKET_ERR 
SETSOCKOPT_ERR 
LISTEN_ERR 
ACCEPT_ERR 
INET_ADDR_ERR 
CONNECT_ERR 
PORT_ERR 

Definition at line 50 of file rlsocket.h.

Constructor & Destructor Documentation

◆ rlSocket() [1/2]

rlSocket::rlSocket ( const char *  adr,
int  port,
int  active 
)
    construct a new rlSocket but do not connect
    adr  = hostname | dotted address
    port = port number of socket
    active = 0 wait for connections with accept()
    active = 1 open the connection with connect()
    active = 2 neither accept() nor connect()

Definition at line 130 of file rlsocket.cpp.

131 {
132  rlwsa(); // init sockets on windows
133  setAdr(a);
134  port = p;
135  active = act;
136  s = -1;
137  os = -1;
138  first = 1;
139  rl_ipversion = 4;
140  memset(sockaddr,0,sizeof(sockaddr));
141 }
int port
Definition: rlsocket.h:262
int first
Definition: rlsocket.h:265
unsigned char sockaddr[16+48]
Definition: rlsocket.h:258
int os
Definition: rlsocket.h:264
int s
Definition: rlsocket.h:197
int active
Definition: rlsocket.h:263
void setAdr(const char *adr)
Definition: rlsocket.cpp:168
int rlwsa()
Definition: rlsocket.cpp:68
int rl_ipversion
Definition: rlsocket.h:267

◆ rlSocket() [2/2]

rlSocket::rlSocket ( int  socket)
    construct a new rlSocket
    use connection on open socket

Definition at line 143 of file rlsocket.cpp.

144 {
145  adr[0] = '\0';
146  port = -1;
147  active = 0;
148  s = socket;
149  os = -1;
150  first = 0;
151  rl_ipversion = 4;
152  memset(sockaddr,0,sizeof(sockaddr));
153 }
int port
Definition: rlsocket.h:262
int first
Definition: rlsocket.h:265
unsigned char sockaddr[16+48]
Definition: rlsocket.h:258
char adr[132]
Definition: rlsocket.h:261
int os
Definition: rlsocket.h:264
int s
Definition: rlsocket.h:197
int active
Definition: rlsocket.h:263
int rl_ipversion
Definition: rlsocket.h:267

◆ ~rlSocket()

rlSocket::~rlSocket ( )
virtual
    destruct the socket
    attention if active = 0 the socket will still be bound to port

Definition at line 155 of file rlsocket.cpp.

156 {
157  disconnect();
158  if(os != -1 && active == 0)
159  {
160 #ifdef RLWIN32
161  closesocket(os);
162 #else
163  close(os);
164 #endif
165  }
166 }
int os
Definition: rlsocket.h:264
int disconnect()
Definition: rlsocket.cpp:529
int active
Definition: rlsocket.h:263

Member Function Documentation

◆ connect()

int rlSocket::connect ( )
    connect
    return >= 0 socket used
    return < 0  error (see: enum SocketEnum)

Definition at line 307 of file rlsocket.cpp.

308 {
309  int option;
310  int ret;
311 #ifdef __VMS
312  size_t socklen = sizeof(struct sockaddr);
313 #else
314  socklen_t socklen = sizeof(struct sockaddr);
315 #endif
316  struct sockaddr_in localAddr;
317  struct sockaddr_in remoteAddr;
318  struct hostent *host;
319  struct in_addr RemoteIpAddress;
320 #ifdef AF_INET6_IS_AVAILABLE
321  struct addrinfo hints0, hints1;
322  struct addrinfo *res, *ressave;
323  int n;
324  char portstr[32];
325 #endif
326 
327  if(port <= 0) return PORT_ERR;
328  if(port >= 256*256) return PORT_ERR;
329  if(active == 0)
330  { // accept calls
331  s = -1;
332  if(rl_ipversion == 4)
333  {
334  if(first == 1)
335  {
336  // create a socket
337  os = socket(AF_INET,SOCK_STREAM,0);
338  if(os == -1) return SOCKET_ERR;
339  // set socket options
340 #ifdef __VMS
341  option = 1;
342  if(setsockopt(os,SOL_SOCKET,SO_KEEPALIVE,&option,sizeof(option)) < 0)
343  {
344  return SETSOCKOPT_ERR;
345  }
346 #endif
347  option = 1;
348 #ifdef RLWIN32
349  setsockopt(os,SOL_SOCKET,SO_REUSEADDR,(const char *) &option,sizeof(option));
350 #else
351  setsockopt(os,SOL_SOCKET,SO_REUSEADDR,&option,sizeof(option));
352 #endif
353  // Bind our server to the agreed upon port number.
354  memset(&localAddr,0,sizeof(localAddr));
355  localAddr.sin_port = htons((short) port);
356  localAddr.sin_family = AF_INET;
357 bind:
358  ret = bind(os, (struct sockaddr *) &localAddr, sizeof(localAddr));
359  if(ret == -1)
360  {
361  ::printf("warning: could not bind to port=%d\n", port);
362  rlwthread_sleep(1000);
363  goto bind;
364  }
365  // Prepare to accept client connections. Allow up to 5 pending
366  // connections.
367  ret = listen(os, 5);
368  if(ret == -1) return LISTEN_ERR;
369  }
370  first = 0;
371 
372  // accept connections
373  if(os < 0) return ACCEPT_ERR;
374  s = accept(os, (struct sockaddr *) &sockaddr[0], &socklen);
375  if(s == -1) return ACCEPT_ERR;
376  }
377  else if(rl_ipversion == 6)
378  {
379 #ifdef AF_INET6_IS_AVAILABLE
380  if(first == 1)
381  {
382  memset(&hints0,0,sizeof(hints0));
383  hints0.ai_flags = AI_PASSIVE;
384  //hints0.ai_family = AF_UNSPEC;
385  hints0.ai_family = AF_INET6;
386  hints0.ai_socktype = SOCK_STREAM;
387  sprintf(portstr,"%d",port);
388  //::printf("server getaddrinfo(%s,%s)\n", adr, portstr);
389  n = getaddrinfo(adr, portstr, &hints0, &res);
390  if(n != 0)
391  {
392 #ifndef RLWIN32
393  ::printf("rlSocket:tcp_listen error for %s port=%s : %s\n", adr, portstr, gai_strerror(n));
394 #endif
395  return -1;
396  }
397  //::printf("done\n");
398  ressave = res;
399 bindv6:
400  do
401  {
402  os = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
403  if(os < 0) continue; // error, try next one
404 #ifdef __VMS
405  option = 1;
406  if(setsockopt(os,SOL_SOCKET,SO_KEEPALIVE,&option,sizeof(option)) < 0)
407  {
408  return SETSOCKOPT_ERR;
409  }
410 #endif
411  option = 1;
412 #ifdef RLWIN32
413  setsockopt(os,SOL_SOCKET,SO_REUSEADDR,(const char *) &option,sizeof(option));
414 #else
415  setsockopt(os,SOL_SOCKET,SO_REUSEADDR,&option,sizeof(option));
416 #endif
417  if(bind(os, res->ai_addr, res->ai_addrlen) == 0) break; // success
418  s = os;
419  disconnect(); // bind error, close and try next one
420  }
421  while((res = res->ai_next) != NULL);
422  if(res == NULL) // errno from final socket() or bind()
423  {
424  ::printf("warning: could not bind to port=%d\n", port);
425  rlwthread_sleep(1000);
426  goto bindv6;
427  }
428  // Prepare to accept client connections. Allow up to 5 pending
429  // connections
430  ret = listen(os, 5);
431  freeaddrinfo(ressave);
432  if(ret == -1) return LISTEN_ERR;
433  }
434  first = 0;
435  // accept connections
436  if(os < 0) return ACCEPT_ERR;
437  s = accept(os, (struct sockaddr *) &sockaddr[0], &socklen);
438  if(s == -1) return ACCEPT_ERR;
439 #else
440  ::printf("rlSocket:ERROR IPV6 not available on this platform\n");
441 #endif
442  }
443  else
444  {
445  ::printf("rlSocket:ERROR: rl_ipversion=%d not known\n", rl_ipversion);
446  }
447  } // end active == 0
448  else if(active == 1)
449  {
450  disconnect();
451  //::printf("debug: adr=%s port=%d\n",adr,port);
452  s = -1;
453  if(rl_ipversion == 4)
454  {
455  os = socket(AF_INET,SOCK_STREAM,0);
456  if(os == -1) return SOCKET_ERR;
457  s = os;
458 
459  //::printf("debug: gethostbyname\n");
460  // fill destblk structure
461  host = gethostbyname(adr);
462  if(host == NULL)
463  {
464  // See if the host is specified in "dot address" form
465  RemoteIpAddress.s_addr = inet_addr(adr);
466  if(RemoteIpAddress.s_addr == INADDR_NONE)
467  {
468  s = -1;
469  return INET_ADDR_ERR; // -1
470  }
471  }
472  else
473  {
474  memcpy(&RemoteIpAddress,host->h_addr,host->h_length);
475  }
476 
477  memset(&remoteAddr,0,sizeof(remoteAddr));
478  remoteAddr.sin_family = AF_INET;
479  remoteAddr.sin_port = htons((short) port);
480  remoteAddr.sin_addr = RemoteIpAddress;
481 
482  //::printf("debug: connect\n");
483  ret = ::connect(s, (struct sockaddr *) &remoteAddr, sizeof(remoteAddr));
484  //::printf("debug: connect ret=%d\n",ret);
485  if(ret == -1)
486  {
487  disconnect(); // close s = os
488  return CONNECT_ERR;
489  }
490  }
491  else if(rl_ipversion == 6)
492  {
493 #ifdef AF_INET6_IS_AVAILABLE
494  sprintf(portstr,"%d",port);
495  memset(&hints1, 0, sizeof(hints1));
496  hints1.ai_family = AF_UNSPEC;
497  hints1.ai_socktype = SOCK_STREAM;
498  n = getaddrinfo(adr, portstr, &hints1, &res);
499  if(n != 0)
500  {
501 #ifndef RLWIN32
502  ::printf("rlSocket:tcp_connect error for %s port=%s : %s\n", adr, portstr, gai_strerror(n));
503 #endif
504  return -1;
505  }
506  ressave = res;
507  do
508  {
509  s = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
510  if(s < 0) continue; // ignore this one
511  if(::connect(s, res->ai_addr, res->ai_addrlen) == 0) break; // success
512  disconnect(); // ignore this one
513  }
514  while((res = res->ai_next) != NULL);
515  if(res == NULL) ::printf("rlSocket:tcp_connect error for %s port=%s\n", adr, portstr);
516  freeaddrinfo(ressave);
517 #else
518  ::printf("rlSocket:ERROR IPV6 not available on this platform\n");
519 #endif
520  }
521  else
522  {
523  ::printf("rlSocket:ERROR: rl_ipversion=%d not known\n", rl_ipversion);
524  }
525  }
526  return s;
527 }
int port
Definition: rlsocket.h:262
int first
Definition: rlsocket.h:265
int WSAAPI getaddrinfo(const char *, const char *, const struct addrinfo *, struct addrinfo **)
unsigned char sockaddr[16+48]
Definition: rlsocket.h:258
char adr[132]
Definition: rlsocket.h:261
int os
Definition: rlsocket.h:264
void WSAAPI freeaddrinfo(struct addrinfo *)
int connect()
Definition: rlsocket.cpp:307
int s
Definition: rlsocket.h:197
int disconnect()
Definition: rlsocket.cpp:529
int active
Definition: rlsocket.h:263
int rlwthread_sleep(long msec)
Definition: rlwthread.cpp:366
int printf(const char *format,...)
Definition: rlsocket.cpp:570
int rl_ipversion
Definition: rlsocket.h:267

◆ disconnect()

int rlSocket::disconnect ( )
    disconnect
    return = 0

Definition at line 529 of file rlsocket.cpp.

530 {
531  if(s != -1)
532  {
533 #ifdef RLWIN32
534  closesocket(s);
535 #else
536  close(s);
537 #endif
538  }
539  s = -1;
540  return 0;
541 }
int s
Definition: rlsocket.h:197

◆ getIPVersion()

int rlSocket::getIPVersion ( )
    return == 4 IPV4
    return == 6 IPV6

Definition at line 595 of file rlsocket.cpp.

596 {
597  return rl_ipversion;
598 }
int rl_ipversion
Definition: rlsocket.h:267

◆ getPort()

int rlSocket::getPort ( )
    get port

Definition at line 181 of file rlsocket.cpp.

182 {
183  return port;
184 }
int port
Definition: rlsocket.h:262

◆ isConnected()

int rlSocket::isConnected ( )
    return == 1 socket is connected
    return == 0 socket is not connected

Definition at line 543 of file rlsocket.cpp.

544 {
545  if(s == -1) return 0;
546  return 1;
547 }
int s
Definition: rlsocket.h:197

◆ printf()

int rlSocket::printf ( const char *  format,
  ... 
)
    similar to printf
    return > 0 length of data written
    return < 0 error

Definition at line 570 of file rlsocket.cpp.

571 {
572  int ret;
573  char message[rl_PRINTF_LENGTH]; // should be big enough
574 
575  va_list ap;
576  va_start(ap,format);
577  ret = rlvsnprintf(message, rl_PRINTF_LENGTH - 1, format, ap);
578  va_end(ap);
579  if(ret < 0) return ret;
580  return write(message,strlen(message));
581 }
int write(const void *buf, int len)
Definition: rlsocket.cpp:282
#define rl_PRINTF_LENGTH
Definition: rldefine.h:71
int rlvsnprintf(char *text, int len, const char *format, va_list ap)
Definition: rlcutil.cpp:197

◆ read()

int rlSocket::read ( void *  buf,
int  len,
int  timeout = 0 
)
    read a block of data
    len = length of data to be read
    timeout = 0 wait indefinite
    timeout > 0 wait at maximum for timeout milliseconds
    return > 0 length of message read
    return == 0 timeout
    return < 0 error

Definition at line 191 of file rlsocket.cpp.

192 {
193  int i,ret;
194  char *cbuf;
195 
196  if(s == -1) return -1;
197  if(select(timeout) == 0) return 0; // timeout
198 
199  cbuf = (char *) buf;
200  i = 0;
201  while(i < len)
202  {
203  ret = recv(s,&cbuf[i],len-i,0);
204  if(ret <= 0)
205  {
206  disconnect();
207  return -1;
208  }
209  i += ret;
210  if(i < len)
211  {
212  if(select(timeout) == 0) return 0; // timeout
213  }
214  }
215 
216  return i;
217 }
int select(int timeout=0)
Definition: rlsocket.cpp:549
int s
Definition: rlsocket.h:197
int disconnect()
Definition: rlsocket.cpp:529

◆ readHttpContentLength()

int rlSocket::readHttpContentLength ( int  timeout)
    read the response to a http get request until Content-Length is received
    Tip: char line[256];

Definition at line 639 of file rlsocket.cpp.

640 {
641  char line[256];
642  while(1)
643  {
644  if(readStr(line, (int)sizeof(line) - 1, timeout) < 1) return -1;
645  if(strncmp(line,"Content-Length:",15) == 0) break;
646  }
647  int len = 0;
648  sscanf(line,"Content-Length: %d", &len);
649  if(readStr(line, (int)sizeof(line) - 1, timeout) < 1) return -1; // read CR LF
650  return len;
651 }
int readStr(char *buf, int len, int timeout=0)
Definition: rlsocket.cpp:219

◆ readHttpHeader()

int rlSocket::readHttpHeader ( rlString header,
int  timeout = 0 
)
    read a http header and return Content-Length
    return < 0 error

Definition at line 256 of file rlsocket.cpp.

257 {
258  char line[4096];
259  int contentLength = 0;
260 
261  *header = "";
262  while(1)
263  {
264  int ret = readStr(line, (int) sizeof(line)-1, timeout);
265  if(ret < 0)
266  {
267  printf("ERROR in rlSocket::readHttpHeader() ret=%d\n", ret);
268  return -1;
269  }
270  *header += line;
271  if(strstr(line, "Content-Length:") != NULL)
272  {
273  sscanf(line,"Content-Length: %d", &contentLength);
274  }
275  if(strlen(line) <= 2)
276  {
277  return contentLength;
278  }
279  }
280 }
int readStr(char *buf, int len, int timeout=0)
Definition: rlsocket.cpp:219
int printf(const char *format,...)
Definition: rlsocket.cpp:570

◆ readStr()

int rlSocket::readStr ( char *  buf,
int  len,
int  timeout = 0 
)
    read a '
' terminated string len = max length of data to be read timeout = 0 wait indefinite timeout > 0 wait at maximum for timeout milliseconds return > 0 length of message read return == 0 timeout return < 0 error

Definition at line 219 of file rlsocket.cpp.

220 {
221  int ret,i;
222 
223  if(s == -1) return -1;
224  if(select(timeout) == 0) return 0; // timeout
225 
226  i = 0;
227  while(1)
228  {
229 #ifdef RLWIN32
230 tryagain:
231 #endif
232  ret = recv(s,&buf[i],1,0);
233  if(ret <= 0)
234  {
235 #ifdef RLWIN32
236  if(WSAEWOULDBLOCK == WSAGetLastError()) goto tryagain;
237 #endif
238  disconnect();
239  buf[i] = '\0';
240  return -1;
241  }
242  if(buf[i] == '\n')
243  {
244  buf[i+1] = '\0';
245  return i+1;
246  }
247  if(i >= len-1)
248  {
249  buf[i+1] = '\0';
250  return i+1;
251  }
252  i++;
253  }
254 }
int select(int timeout=0)
Definition: rlsocket.cpp:549
int s
Definition: rlsocket.h:197
int disconnect()
Definition: rlsocket.cpp:529

◆ rlGetsockopt() [1/2]

int rlSocket::rlGetsockopt ( int  sockfd,
int  level,
int  optname,
void *  optval,
int *  optlen 
)
static
    portable version of getsockopt

Definition at line 600 of file rlsocket.cpp.

601 {
602 #ifdef RLWIN32
603  return getsockopt(sockfd, level, optname, (char *) optval, optlen);
604 #elif defined(__VMS)
605  size_t len = *optlen;
606  int ret = getsockopt(sockfd, level, optname, optval, &len);
607  *optlen = len;
608  return ret;
609 #else
610  socklen_t len = *optlen;
611  int ret = getsockopt(sockfd, level, optname, optval, &len);
612  *optlen = len;
613  return ret;
614 #endif
615 }

◆ rlGetsockopt() [2/2]

int rlSocket::rlGetsockopt ( int  level,
int  optname 
)
    get an option from this->s

Definition at line 626 of file rlsocket.cpp.

627 {
628  int option = 1;
629  int len = sizeof(option);
630  return rlGetsockopt(s,level,optname,&option,&len);
631 }
int s
Definition: rlsocket.h:197
static int rlGetsockopt(int sockfd, int level, int optname, void *optval, int *optlen)
Definition: rlsocket.cpp:600

◆ rlSetsockopt() [1/2]

int rlSocket::rlSetsockopt ( int  sockfd,
int  level,
int  optname,
const void *  optval,
int  optlen 
)
static
    portable version of setsockopt

Definition at line 617 of file rlsocket.cpp.

618 {
619 #ifdef RLWIN32
620  return setsockopt(sockfd, level, optname, (const char *) optval, optlen);
621 #else
622  return setsockopt(sockfd, level, optname, optval, optlen);
623 #endif
624 }

◆ rlSetsockopt() [2/2]

int rlSocket::rlSetsockopt ( int  level,
int  optname 
)
    set an option on this->s

Definition at line 633 of file rlsocket.cpp.

634 {
635  int option = 1;
636  return rlSetsockopt(s,level,optname,&option,sizeof(option));
637 }
static int rlSetsockopt(int sockfd, int level, int optname, const void *optval, int optlen)
Definition: rlsocket.cpp:617
int s
Definition: rlsocket.h:197

◆ select()

int rlSocket::select ( int  timeout = 0)
    wait for data arriving on socket
    timeout > 0 timeout in milliseconds
    timeout == 0 indefinite timeout
    return = 1 DATA_AVAILABLE
    return = 0 TIMEOUT

Definition at line 549 of file rlsocket.cpp.

550 {
551  struct timeval timout;
552  fd_set wset,rset,eset;
553  int ret,maxfdp1;
554 
555  if(timeout == 0) return 1;
556  /* setup sockets to read */
557  maxfdp1 = s+1;
558  FD_ZERO(&rset);
559  FD_SET (s,&rset);
560  FD_ZERO(&wset);
561  FD_ZERO(&eset);
562  timout.tv_sec = timeout / 1000;
563  timout.tv_usec = (timeout % 1000) * 1000;
564 
565  ret = ::select(maxfdp1,&rset,&wset,&eset,&timout);
566  if(ret == 0) return 0; /* timeout */
567  return 1;
568 }
int select(int timeout=0)
Definition: rlsocket.cpp:549
int s
Definition: rlsocket.h:197

◆ sendProcessViewBrowserButtonEvent()

int rlSocket::sendProcessViewBrowserButtonEvent ( int  id)
    This method is intendet for data providers implemented as ProcessViewServer

Definition at line 583 of file rlsocket.cpp.

584 {
585  return printf("QPushButton(%d)\n",id);
586 }
int printf(const char *format,...)
Definition: rlsocket.cpp:570

◆ setActive()

void rlSocket::setActive ( int  active)
    set port active = 0|1

Definition at line 186 of file rlsocket.cpp.

187 {
188  active = act;
189 }
int active
Definition: rlsocket.h:263

◆ setAdr()

void rlSocket::setAdr ( const char *  adr)
    set adr to a different adr than in the constructor

Definition at line 168 of file rlsocket.cpp.

169 {
170  adr[0] = '\0';
171  if(a == NULL) return;
172  if((strlen(a)+1) > sizeof(adr)) return;
173  strcpy(adr,a);
174 }
char adr[132]
Definition: rlsocket.h:261

◆ setIPVersion()

int rlSocket::setIPVersion ( int  version)
    default: prefer IPV4
    if(ip==6) prefer IPV6
    else      prefer IPV4

Definition at line 588 of file rlsocket.cpp.

589 {
590  if(version == 6) rl_ipversion = 6;
591  else rl_ipversion = 4;
592  return rl_ipversion;
593 }
int rl_ipversion
Definition: rlsocket.h:267

◆ setPort()

void rlSocket::setPort ( int  port)
    set port to a different port than in the constructor

Definition at line 176 of file rlsocket.cpp.

177 {
178  port = p;
179 }
int port
Definition: rlsocket.h:262

◆ write()

int rlSocket::write ( const void *  buf,
int  len 
)
    write a block of data
    return > 0 length of data written
    return < 0 error

Definition at line 282 of file rlsocket.cpp.

283 {
284  int ret,bytes_left,first_byte;
285  const char *cbuf;
286 
287  if(s == -1) return -1;
288  cbuf = (char *) buf;
289  bytes_left = len;
290  first_byte = 0;
291 
292  while(bytes_left > 0)
293  {
294  ret = send(s,&cbuf[first_byte],bytes_left,MSG_NOSIGNAL);
295  if(ret <= 0)
296  {
297  disconnect();
298  return -1;
299  }
300  bytes_left -= ret;
301  first_byte += ret;
302  }
303 
304  return first_byte;
305 }
#define MSG_NOSIGNAL
Definition: rlsocket.cpp:53
int s
Definition: rlsocket.h:197
int disconnect()
Definition: rlsocket.cpp:529

Member Data Documentation

◆ active

int rlSocket::active
private

Definition at line 263 of file rlsocket.h.

◆ adr

char rlSocket::adr[132]
private

Definition at line 261 of file rlsocket.h.

◆ first

int rlSocket::first
private

Definition at line 265 of file rlsocket.h.

◆ os

int rlSocket::os
private

Definition at line 264 of file rlsocket.h.

◆ port

int rlSocket::port
private

Definition at line 262 of file rlsocket.h.

◆ prefer_ipv6

int rlSocket::prefer_ipv6
private

Definition at line 266 of file rlsocket.h.

◆ rl_ipversion

int rlSocket::rl_ipversion
private

Definition at line 267 of file rlsocket.h.

◆ s

int rlSocket::s
    this is the real socket used for communication
    s >= 0  connected
    s == -1 disconnected

Definition at line 197 of file rlsocket.h.

◆ sockaddr

unsigned char rlSocket::sockaddr[16+48]
    this array can be casted to (struct sockaddr *) &sockaddr[0];
    in case of active==0 it will store sockaddr of the last client
    (48 bytes spare)
    struct sockaddr {
      unsigned short    sa_family;    // address family, AF_xxx
      char              sa_data[14];  // 14 bytes of protocol address
    };
    // IPv4 AF_INET sockets:
    struct sockaddr_in {
      short            sin_family;   // e.g. AF_INET, AF_INET6
      unsigned short   sin_port;     // e.g. htons(3490)
      struct in_addr   sin_addr;     // see struct in_addr, below
      char             sin_zero[8];  // zero this if you want to
    };
    struct in_addr {
      unsigned long s_addr;          // load with inet_pton()
    };
    // IPv6 AF_INET6 sockets:
    struct sockaddr_in6 {
      u_int16_t       sin6_family;   // address family, AF_INET6
      u_int16_t       sin6_port;     // port number, Network Byte Order
      u_int32_t       sin6_flowinfo; // IPv6 flow information
      struct in6_addr sin6_addr;     // IPv6 address
      u_int32_t       sin6_scope_id; // Scope ID
    };
    struct in6_addr {
        unsigned char   s6_addr[16];   // load with inet_pton()
    };

Definition at line 258 of file rlsocket.h.


The documentation for this class was generated from the following files: