ssize_t csocket::send(const void *buffer, size_t size) const
{
+ const int TIMEOUT = 5;
+ fd_set write_fds;
+ struct timeval tv;
+
if (!is_valid())
return -EINVAL;
+ FD_ZERO(&write_fds);
+ FD_SET(m_sock_fd, &write_fds);
+ tv.tv_sec = TIMEOUT;
+ tv.tv_usec = 0;
+
+ int ret;
+
+ ret = select(m_sock_fd + 1, NULL, &write_fds, NULL, &tv);
+
+ if (ret == -1) {
+ _ERRNO(errno, _E, "select error: sock_fd: %d\n for %s", m_sock_fd, get_client_name());
+ return false;
+ } else if (!ret) {
+ _ERRNO(errno, _E, "select timeout: %d seconds elapsed for %s", tv.tv_sec, get_client_name());
+ return false;
+ }
+
+ if (!FD_ISSET(m_sock_fd, &write_fds)) {
+ _ERRNO(errno, _E, "select failed for %s, nothing to write, m_sock_fd : %d", get_client_name(), m_sock_fd);
+ return false;
+ }
+
if (m_sock_type == SOCK_STREAM)
return send_for_stream(buffer, size);