/* c_socket's definition */ #include "c_socket.h" /* constructor */ c_socket::c_socket() { #ifdef WIN32 WSADATA Data; WSAStartup (MAKEWORD (2, 2), &Data); #endif m_sock = -1; memset(&m_sin,0,sizeof(SOCKADDR_IN)); m_sockError.clear(); } /* destructor */ c_socket::~c_socket() { if (m_sock > 0) { ::closesocket(m_sock); m_sock = -1; } #ifdef WIN32 WSACleanup(); #endif memset(&m_sin,0,sizeof(SOCKADDR_IN)); m_sockError.clear(); } /* error's copy */ void c_socket::setSockError() { m_sockError = strerror(socketerror); } /* socket's initialization */ bool c_socket::init() { m_sin.sin_family = AF_INET; m_sock = socket (AF_INET, SOCK_STREAM, 0); if (m_sock < 0) { setSockError(); return false; } else return true; } /* address's definition */ bool c_socket::setAddress(char *address) { struct hostent *host_ip; m_sin.sin_addr.s_addr = inet_addr(address); if (m_sin.sin_addr.s_addr == -1) { host_ip = gethostbyname (address); 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; } /* port's definition */ void c_socket::setPort(unsigned short int port) { m_sin.sin_port = htons(port); } bool c_socket::setPort(char *buffer) { unsigned short int port; for (int i = 0; buffer[i] != 0; i++) if (!isdigit (buffer[i])) { m_sockError = "invalid port"; return false; } port = atoi (buffer); m_sin.sin_port = htons (port); return true; } /* connection */ bool c_socket::connection() { if (connect (m_sock, (sockaddr*)&m_sin, sizeof(SOCKADDR_IN)) < 0) { setSockError(); return false; } return true; } /* for send */ bool c_socket::send(string buffer) { int size; if(size = ::send (m_sock, buffer.c_str(), buffer.length(), 0) < 0) { setSockError(); return false; } else if(size < buffer.length()) { setSockError(); return false; } else return true; } /* for receive */ bool c_socket::recv() { fd_set rfds; struct timeval tv; int a; FD_ZERO(&rfds); FD_SET(m_sock, &rfds); tv.tv_sec = 0; tv.tv_usec = 0; a = select(m_sock+1, &rfds, NULL, NULL, &tv); if(a) { m_size = ::recv(m_sock, recvBuffer, 2047, 0); //2047 + '\0' if(m_size <= 0) { setSockError(); return false; } else recvBuffer[m_size] = '\0'; } return true; } /* for close ... */ void c_socket::close() { if (m_sock > 0) { ::closesocket(m_sock); m_sock = -1; } } string c_socket::getSockError() { return m_sockError; } int c_socket::getSize() { return m_size; }