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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }