Пример #1
0
	std::size_t winsock2_streambuf::write_some(const char_type * data, std::size_t count)
	{
		//if (!is_valid()) return 0;
		auto until = time_point::clock::now() + m_timeout;
		do {

#ifdef EXT_ENABLE_OPENSSL
			if (ssl_started())
			{
				int res = ::SSL_write(m_sslhandle, data, count);
				if (res > 0) return res;

				if (ssl_rw_error(res, m_lasterror)) return 0;
				continue;
			}
#endif // EXT_ENABLE_OPENSSL

			int res = ::send(m_sockhandle, data, count, 0);
			if (res > 0) return res;

			if (rw_error(res, ::WSAGetLastError(), m_lasterror)) return 0;
			continue;

		} while (wait_readable(until));
		return 0;
	}
Пример #2
0
int TCPSocketServer::accept(TCPSocketConnection& connection) {
    if (_sock_fd < 0) {
        return -1;
    }

    if (!_blocking) {
        TimeInterval timeout(_timeout);
        if (wait_readable(timeout) != 0) {
            return -1;
        }
    }

    connection.reset_address();
    socklen_t newSockRemoteHostLen = sizeof(connection._remote_host);
    int fd = _cc3000_module->_socket.accept(_sock_fd, (sockaddr *) &connection._remote_host, &newSockRemoteHostLen);
    if (fd < 0) {
        return -1;
    }
    /* s_addr is returned in the little endian */
    connection._remote_host.sin_addr.s_addr = htonl(connection._remote_host.sin_addr.s_addr);
    connection._sock_fd = fd;
    connection._is_connected = true;

    return 0;
}
Пример #3
0
	std::size_t bsdsock_streambuf::read_some(char_type * data, std::size_t count)
	{
		//if (!is_valid()) return 0;

		auto until = time_point::clock::now() + m_timeout;
		do {

#ifdef EXT_ENABLE_OPENSSL
			if (ssl_started())
			{
				int res = ::SSL_read(m_sslhandle, data, count);
				if (res > 0) return res;

				if (ssl_rw_error(res, m_lasterror)) return 0;
				continue;
			}
#endif // EXT_ENABLE_OPENSSL

			int res = ::recv(m_sockhandle, data, count, 0);
			if (res > 0) return res;

			if (rw_error(res, errno, m_lasterror)) return 0;
			continue;

		} while (wait_readable(until));
		return 0;
	}
Пример #4
0
bool net::socket::accept(socket& s, socket_address* addr, socklen_t* addrlen, int timeout)
{
	if (timeout != 0) {
		if (!wait_readable(timeout)) {
			return false;
		}
	}

	int fd;

#if HAVE_ACCEPT4
	if ((fd = accept4(_M_fd, reinterpret_cast<struct sockaddr*>(addr), addrlen, SOCK_NONBLOCK)) < 0) {
		return false;
	}

	s._M_fd = fd;
#else
	if ((fd = ::accept(_M_fd, reinterpret_cast<struct sockaddr*>(addr), addrlen)) < 0) {
		return false;
	}

	s._M_fd = fd;

	if (!s.set_non_blocking()) {
		s.close();
		return false;
	}
#endif

	return true;
}
int TCPSocketConnection::receive_all(char *data, int length) {
    if ((_sock_fd < 0) || !_is_connected) {
        return -1;
    }

    int readLen = 0;
    TimeInterval timeout(_timeout);
    while (readLen < length) {
        if (!_blocking) {
            //Wait for socket to be readable
            if (wait_readable(timeout) != 0)
                return readLen;
        }

        int ret = _cc3000_module->_socket.recv(_sock_fd, data + readLen, length - readLen, 0);
        if (ret > 0) {
            readLen += ret;
        } else if (ret == 0) {
            _is_connected = false;
            return readLen;
        } else {
            return -1; //Connnection error
        }
    }
    return readLen;
}
Пример #6
0
ssize_t net::socket::readv(const struct iovec* iov, unsigned iovcnt, int timeout)
{
	ssize_t ret;

	if (timeout == 0) {
		while (((ret = ::readv(_M_fd, iov, iovcnt)) < 0) && (errno == EINTR));
	} else {
		do {
			if (!wait_readable(timeout)) {
				return -1;
			}
		} while (((ret = ::readv(_M_fd, iov, iovcnt)) < 0) && ((errno == EINTR) || (errno == EAGAIN)));
	}

	return ret;
}
Пример #7
0
ssize_t net::socket::read(void* buf, size_t count, int timeout)
{
	ssize_t ret;

	if (timeout == 0) {
		while (((ret = recv(_M_fd, buf, count, 0)) < 0) && (errno == EINTR));
	} else {
		do {
			if (!wait_readable(timeout)) {
				return -1;
			}
		} while (((ret = recv(_M_fd, buf, count, 0)) < 0) && ((errno == EINTR) || (errno == EAGAIN)));
	}

	return ret;
}
int TCPSocketConnection::receive(char *data, int length) {
    if ((_sock_fd < 0) || !_is_connected) {
        return -1;
    }

    if (!_blocking) {
        TimeInterval timeout(_timeout);
        if (wait_readable(timeout) != 0)
            return -1;
    }

    int n = _cc3000_module->_socket.recv(_sock_fd, data, length, 0);
    if (n >= 0) {
        _is_connected = 1;
    } else {
        _is_connected = 0;
    }

    return n;
}
Пример #9
0
static int receive_all(int sockfd, char *buf, size_t length) {
    int bytes_received = 0;
    struct timeval timeout = {HTTP_DEFAULT_TIMEOUT, 0};

    while (bytes_received < (int)length) {
        int ret;
        ret = wait_readable(sockfd, timeout);
        if (ret != 0)
            return -1;

        ret = recv(sockfd, buf + bytes_received, length - bytes_received, 0);
        if (ret > 0) {
            bytes_received += ret;
        } else if (ret == 0) {
            return bytes_received;
        } else {
            return -1;
        }
    }
    return bytes_received;
}
Пример #10
0
int make_dns_query(char *buf, int query_len, time_t *ttl, int *Anum)
{
    struct sockaddr_in addr;
    int sockfd = -1;
    struct timeval timeout = { RETRANS_INTERVAL, 0 };
    int i, ret = -1;
    int addrlen, send_len, result_len;
    int try_num = 0;
    dns_head_type *dns_head;
#ifdef WIN32
    WSADATA wsa;
    WSAStartup(MAKEWORD(2, 2), &wsa);
#endif

    addr.sin_family = AF_INET;
    //addr.sin_addr.s_addr = inet_addr(PUBLIC_DNS_DEFAULT_SERVER);
    inet_pton(AF_INET, PUBLIC_DNS_DEFAULT_SERVER, &(addr.sin_addr.s_addr));
    addr.sin_port = htons((uint16_t)PUBLIC_DNS_DEFAULT_PORT);
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (-1 == sockfd) {
        fprintf(stderr, "socket error\n");
        goto clear;
    }

    ret = wait_writable(sockfd, timeout);
    if (ret != 0) {
        fprintf(stderr, "wait writable timeout\n");
        goto clear;
    }
    while (try_num++ <= RETRANS_TRY_NUM) {
        send_len = sendto(sockfd, buf, query_len, 0, (struct sockaddr*)&addr, sizeof(struct sockaddr));
        if (send_len != query_len) {
            fprintf(stderr, "sendto dns query failed\n");
            ret = -1;
            goto clear;
        }
        ret = wait_readable(sockfd, timeout);
        if (ret == 0) {
            break;
        }
    }
    if (try_num > RETRANS_TRY_NUM) {
        fprintf(stderr, "dns query failed over try num\n");
        ret = -1;
        goto clear;
    }

    addrlen = sizeof(struct sockaddr);
    result_len = recvfrom(sockfd, buf, DNS_DEFAULT_DATA_SIZE, 0/*MSG_WAITALL*/,
        (struct sockaddr *)&addr, (socklen_t*)&addrlen);
    if (result_len <= 0) {
        fprintf(stderr, "receve dns response failed\n");
        ret = -1;
        goto clear;
    }

    //只支持A记录
    dns_head = (dns_head_type *)buf;
    int off = 0;
    int num = DNS_GET16(dns_head->numA);
    for (i = 0; i < num; i++) {
        char *result_set = buf + query_len + off;
        response *rp = (response *)(result_set + 2); //2 bytes' offsets
        uint16_t type = DNS_GET16(rp->type);
        *ttl = DNS_GET32(rp->ttl);
        //解析A记录
        if (TYPE_A == type) {
            memcpy(buf + (*Anum) * 4, (char *)(rp + 1), 4);
            (*Anum)++;
            off += (2 + sizeof(response) + 4);
        }
        else if (TYPE_CNAME == type) {
            //如果是CNAME记录则直接查找下一条记录
            off += (2 + sizeof(response) + DNS_GET16(rp->length));
        }
        else {
            //其他类型不支持
            goto clear;
        }
    }

    ret = 0;

clear:
    if (sockfd != -1) {
#ifdef WIN32
        closesocket(sockfd);
        WSACleanup();
#else
        close(sockfd);
#endif
    }

    return ret;
}