#include "socket.h" /* constructeur */ c_sock::c_sock() { #ifdef WIN32 WSADATA Data; WSAStartup (MAKEWORD (2, 2), &Data); #endif m_sock = -1; memset(&m_sin,0,sizeof(SOCKADDR_IN)); m_sockerror[0] = '\0'; } /* destructeur */ c_sock::~c_sock() { if (m_sock > 0) { ::closesocket(m_sock); m_sock = -1; } #ifdef WIN32 WSACleanup(); #endif memset(&m_sin,0,sizeof(SOCKADDR_IN)); m_sockerror[0] = '\0'; } /* fonction qui copi les erreures */ void c_sock::setsockerror() { strcpy(m_sockerror, strerror(socketerror)); } /* initialise la socket */ bool c_sock::init() { m_sin.sin_family = AF_INET; m_sock = socket (AF_INET, SOCK_STREAM, 0); //0 ou IPPROTO_TCP if (m_sock < 0) { setsockerror(); return false; } else return true; } /* défini l'ip */ bool c_sock::setadresse(char *buff) { struct hostent *host_ip; m_sin.sin_addr.s_addr = inet_addr(buff); if (m_sin.sin_addr.s_addr == -1) { host_ip = gethostbyname (buff); if (host_ip == NULL) { setsockerror(); return false; } else { memcpy ((char *) &m_sin.sin_addr.s_addr, host_ip->h_addr, host_ip->h_length); return true; } } return true; } /* défini le port */ void c_sock::setport(unsigned short port) { m_sin.sin_port = htons(port); } /* défini le port */ bool c_sock::setport(char *buffer) { unsigned short int port; for (int i = 0; buffer[i] != 0; i++) if (!isdigit (buffer[i])) { strcpy (m_sockerror, "invalide port"); return false; } port = atoi (buffer); m_sin.sin_port = htons (port); return true; } /* pour se connecter */ bool c_sock::connexion() { if (connect (m_sock, (sockaddr*)&m_sin, sizeof(SOCKADDR_IN)) < 0) { setsockerror(); return false; } return true; } /* pour envoyer */ bool c_sock::send(char *buff) { if (::send (m_sock, buff, strlen(buff), 0) < 0) { setsockerror(); return false; } return true; } /* pour recevoir */ bool c_sock::recv(char *buff, int len) { m_taille = ::recv(m_sock, buff, len, 0); if(m_taille <= 0) { //<= parce qu'en cas de déco du server, ca renvoi 0 setsockerror(); return false; } else { buff[m_taille] = '\0'; return true; } } /* pour fermer la socket */ void c_sock::close() { if (m_sock > 0) { ::closesocket(m_sock); m_sock = -1; } } /* renvoi m_error */ char* c_sock::getsockerror() { return m_sockerror; } /* retourne m_taille */ int c_sock::gettaille() { return m_taille; }