// Copyright (c) 1999-2000 David Muse // See the COPYING file for more information. #ifndef GENERICSOCKET_H #define GENERICSOCKET_H #include <strstream.h> #include <sys/types.h> #include <sys/un.h> #include <netinet/in.h> #include <netdb.h> // The client class allows you to write programs that can talk to other // programs over TCP connections. // // It provides connection management and data transfer methods but // does not imply any particular client/server protocol. // // The class supports TCP connections over Inet and Unix domain sockets. // Inet sockets allow clients and servers on different machines to talk over a // network. Unix sockets allow clients and servers on the same machine to // talk. Inet sockets can be used by clients and servers on the same machine // but Unix sockets generally perform better. // // This class is a base class for the client and server socket classes. It // provides methods for reading and writing data across sockets, closing sockets // and managing errors. The client and server socket classes provide methods // for listening on ports and connecting to servers. class genericsocket { public: genericsocket(); genericsocket(int descriptor); // creates an instance of genericsocket using the // already open socket represented by "descriptor" virtual ~genericsocket(); void showErrors(); // errors will be printed to stderr void dontShowErrors(); // errors will not be printed at all void retryInterruptedReads(); // causes reads that were interrupted by signals to // retry and not return errors void dontRetryInterruptedReads(); // causes reads that were interrupted by signals to // return errors and not retry void retryInterruptedWrites(); // causes writes that were interrupted by signals to // retry and not return errors void dontRetryInterruptedWrites(); // causes writes that were interrupted by signals to // return errors and not retry // These methods write data to the socket. On success, the // number of bytes written is returned. On failure, a -1 is // returned. int writeData(unsigned short number); int writeData(unsigned long number); int writeData(float number); int writeData(double number); int writeData(char character); int writeData(char *string); int writeData(char *string, size_t size); int writeData(void *buffer, size_t size); // These methods read data from the socket. If no data is // available, they will wait until data is available or // the connection is closed. On success, the number of bytes // read is returned. On failure, a -1 is returned. int readData(unsigned short *buffer); int readData(unsigned long *buffer); int readData(float *buffer); int readData(double *buffer); int readData(char *buffer, size_t size); int readData(void *buffer, size_t size); int readData(strstream *buffer, char *terminator); // These methods allow you to pass file descriptors between // processes. They only work over unix sockets. int passFileDescriptor(int descriptor); int receiveFileDescriptor(int *descriptor); int closeSocket(); // closes the socket int getDescriptor(); // returns the internal file descriptor for the socket int isInetSocket(); // returns 1 if the socket is an inet domain socket // and 0 if the socket is a unix domain socket int isUnixSocket(); // returns 1 if the socket is a unix domain socket // and 0 if the socket is an inet domain socket protected: #include <rudiments/private/genericsocket.h> }; #endif