diff options
Diffstat (limited to 'socket.h')
-rw-r--r-- | socket.h | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/socket.h b/socket.h new file mode 100644 index 0000000..6c64816 --- /dev/null +++ b/socket.h @@ -0,0 +1,168 @@ +#include <sys/socket.h> +#include <netdb.h> +#include <arpa/inet.h> +#include <vector> +#include <string> +#include <string.h> +#include <sstream> +#include <unistd.h> +using namespace std; + +#define _CONNECT 0 +#define _BIND 1 + +#define _BUFF_SIZE 512 //bytes + +//ERROR CODES +#define _ERR 1 +#define _ERR_ACC 3 +#define _ERR_SOCK 4 +#define _ERR_CONNECT 5 +#define _ERR_BIND 6 +#define _ERR_RECV 7 +#define _ERR_SND 8 + +class cSocket +{ +public: + cSocket(char *host, int port, unsigned int mode); + + int init(); //connects or binds the socket + + int Send(int socket, char *data); //Send with char* + int Send(int socket, string data); //Send with string + + string recieve(int socket); + int waitConn(int *socketNum, sockaddr_in *client); + + int Close(int socket); + int quit(); + +private: + long getIP(char *_host); //resolves hostname + + int main_sock; //main Socket + struct sockaddr_in server; //sockadddr_in for main_sock + + char buffer[_BUFF_SIZE]; //Output Buffer + //std::vector<int> sockets; //stores sockets + unsigned int socketMode; //stores Mode + int connected; +}; + +cSocket::cSocket(char *host, int port, unsigned int mode) +{ + main_sock = socket(AF_INET, SOCK_STREAM, 0); + socketMode = mode; + server.sin_port = htons(port); + server.sin_family = AF_INET; + + if(mode == _CONNECT) + server.sin_addr.s_addr = getIP(host); + + else if (mode == _BIND) + server.sin_addr.s_addr = INADDR_ANY; // accept on any incoming address + + connected = 0; +}//cSocket + +int cSocket::init() +{ + if (main_sock == -1) + return _ERR_SOCK; + + if (socketMode == _CONNECT) + { + if (connect(main_sock , (struct sockaddr *)&server , sizeof(server)) < 0) + return _ERR_CONNECT; + } + else if (socketMode == _BIND) + { + if( bind(main_sock,(struct sockaddr *)&server , sizeof(server)) < 0) + return _ERR_BIND; + + listen(main_sock , 3); + } + else + return 3; + + connected = 1; + return 0; +}//init + +int cSocket::waitConn(int *socket, sockaddr_in *client) +{ + int sz = sizeof(struct sockaddr_in); + int tmpSocket = accept(main_sock, (struct sockaddr *)client, (socklen_t*)&sz); + + if (tmpSocket < 0) + return _ERR_ACC; + + *socket = tmpSocket; + return 0; +}//waitConn + +int cSocket::Send(int socket, char *data) +{ + if (main_sock == -1 || connected < 1) + return _ERR_SOCK; + + if( send(socket, data , strlen(data) , 0) < 0) + return _ERR_SND; + + return 0; +}//Send + +int cSocket::Send(int socket, string data) +{ + const char *cData = data.c_str(); //Convert to char* + return Send(socket, cData); +}//Send + +string cSocket::recieve(int socket) +{ + for (int i = 0; i < _BUFF_SIZE; i++) + { + buffer[i] = 0; + } + + if( recv(socket, buffer , _BUFF_SIZE , 0) < 0) + return ""; + + string ret (buffer); + return ret; +}//recieve + +int cSocket::Close(int socket) +{ + close(socket); + return 0; +}//close + +int cSocket::quit() +{ + Close(main_sock); + + main_sock = -1; + connected = 0; + + return 0; +}//quit + +long cSocket::getIP(char *_host) +{ + char ip[100]; + struct hostent *he; + struct in_addr **addr_list; + int i; + + if ( (he = gethostbyname( _host ) ) == NULL) + return 1; + + addr_list = (struct in_addr **) he->h_addr_list; + + for(i = 0; addr_list[i] != NULL; i++) + strcpy(ip , inet_ntoa(*addr_list[i]) ); + + return inet_addr(ip); +}//getIP |