if (!is_valid ()) { return false; } m_addr.sin_family = AF_INET; m_addr.sin_addr.s_addr = INADDR_ANY; m_addr.sin_port = htons (port); int bind_return =::bind (m_sock, (struct sockaddr *) &m_addr, sizeof (m_addr)); if (bind_return == -1) { return false; } return true; } bool Socket::listen () const { if (!is_valid ()) { return false; } int listen_return =::listen (m_sock, MAXCONNECTIONS); if (listen_return == -1) { return false; } return true; } bool Socket::accept (Socket & new_socket) const { int addr_length = sizeof (m_addr); new_socket.m_sock =::accept (m_sock, (sockaddr *) & m_addr, (socklen_t *) & addr_length); if (new_socket.m_sock <= 0) return false; else return true; } bool Socket::send (const std::string s) const { int status =::send (m_sock, s.c_str (), s.size (), MSG_NOSIGNAL); if (status == -1) { return false; } else { return true; } } int Socket::recv (std::string & s) const { char buf[MAXRECV + 1]; s = ""; memset (buf, 0, MAXRECV + 1); int status =::recv (m_sock, buf, MAXRECV, 0); if (status == -1) { // Non accetta std::cout qui std::cout << "status == -1 errno == " << errno << " in Socket::recv\n"; return 0; } else if (status == 0) { return 0; } else { s = buf; return status; } } bool Socket::connect (const std::string host, const int port) { if (!is_valid ()) return false; m_addr.sin_family = AF_INET; m_addr.sin_port = htons (port); int status = inet_pton (AF_INET, host.c_str (), &m_addr.sin_addr); if (errno == EAFNOSUPPORT) return false; status =::connect (m_sock, (sockaddr *) & m_addr, sizeof (m_addr)); if (status == 0) return true; else return false; } void Socket::set_non_blocking (const bool b) { int opts; opts = fcntl (m_sock, F_GETFL); if (opts < 0) { return; } if (b) opts = (opts | O_NONBLOCK); else opts = (opts & ~O_NONBLOCK); fcntl (m_sock, F_SETFL, opts); }