std::pair<std::ostream *, std::ostream *> HTTPServerResponseImpl::beginSend() { poco_assert (!_pStream); poco_assert (!_pHeaderStream); // NOTE Code is not exception safe. if ((_pRequest && _pRequest->getMethod() == HTTPRequest::HTTP_HEAD) || getStatus() < 200 || getStatus() == HTTPResponse::HTTP_NO_CONTENT || getStatus() == HTTPResponse::HTTP_NOT_MODIFIED) { throw Exception("HTTPServerResponse::beginSend is invalid for HEAD request"); } else if (getChunkedTransferEncoding()) { _pHeaderStream = new HTTPHeaderOutputStream(_session); beginWrite(*_pHeaderStream); _pStream = new HTTPChunkedOutputStream(_session); } else if (hasContentLength()) { throw Exception("HTTPServerResponse::beginSend is invalid for response with Content-Length header"); } else { _pStream = new HTTPOutputStream(_session); _pHeaderStream = _pStream; setKeepAlive(false); beginWrite(*_pStream); } return std::make_pair(_pHeaderStream, _pStream); }
void Socket::initSndRcv(const int isUinx) { setNotLinger(); setKeepAlive(); setNoBuf(); if (isUinx) return; }
void EAbstractSocketSessionConfig::doSetAll(EIoSessionConfig* config) { ESocketSessionConfig* ssc = dynamic_cast<ESocketSessionConfig*>(config); if (!ssc) { return; } EAbstractSocketSessionConfig* cfg = dynamic_cast<EAbstractSocketSessionConfig*>(config); if (cfg) { // Minimize unnecessary system calls by checking all 'propertyChanged' properties. if (cfg->isKeepAliveChanged()) { setKeepAlive(cfg->isKeepAlive()); } if (cfg->isOobInlineChanged()) { setOobInline(cfg->isOobInline()); } if (cfg->isReceiveBufferSizeChanged()) { setReceiveBufferSize(cfg->getReceiveBufferSize()); } if (cfg->isReuseAddressChanged()) { setReuseAddress(cfg->isReuseAddress()); } if (cfg->isSendBufferSizeChanged()) { setSendBufferSize(cfg->getSendBufferSize()); } if (cfg->isSoLingerChanged()) { setSoLinger(cfg->getSoLinger()); } if (cfg->isTcpNoDelayChanged()) { setTcpNoDelay(cfg->isTcpNoDelay()); } if (cfg->isTrafficClassChanged() && getTrafficClass() != cfg->getTrafficClass()) { setTrafficClass(cfg->getTrafficClass()); } } else { ESocketSessionConfig* cfg = dynamic_cast<ESocketSessionConfig*>(config); setKeepAlive(cfg->isKeepAlive()); setOobInline(cfg->isOobInline()); setReceiveBufferSize(cfg->getReceiveBufferSize()); setReuseAddress(cfg->isReuseAddress()); setSendBufferSize(cfg->getSendBufferSize()); setSoLinger(cfg->getSoLinger()); setTcpNoDelay(cfg->isTcpNoDelay()); if (getTrafficClass() != cfg->getTrafficClass()) { setTrafficClass(cfg->getTrafficClass()); } } }
bool TransportTCP::initializeSocket() { ROS_ASSERT(sock_ != ROS_INVALID_SOCKET); if (!setNonBlocking()) { return false; } setKeepAlive(s_use_keepalive_, 60, 10, 9); // connect() will set cached_remote_host_ because it already has the host/port available if (cached_remote_host_.empty()) { if (is_server_) { cached_remote_host_ = "TCPServer Socket"; } else { std::stringstream ss; ss << getClientURI() << " on socket " << sock_; cached_remote_host_ = ss.str(); } } if (local_port_ < 0) { la_len_ = s_use_ipv6_ ? sizeof(sockaddr_in6) : sizeof(sockaddr_in); getsockname(sock_, (sockaddr *)&local_address_, &la_len_); switch (local_address_.ss_family) { case AF_INET: local_port_ = ntohs(((sockaddr_in *)&local_address_)->sin_port); break; case AF_INET6: local_port_ = ntohs(((sockaddr_in6 *)&local_address_)->sin6_port); break; } } #ifdef ROSCPP_USE_TCP_NODELAY setNoDelay(true); #endif ROS_ASSERT(poll_set_ || (flags_ & SYNCHRONOUS)); if (poll_set_) { ROS_DEBUG("Adding tcp socket [%d] to pollset", sock_); poll_set_->addSocket(sock_, boost::bind(&TransportTCP::socketUpdate, this, _1), shared_from_this()); } if (!(flags_ & SYNCHRONOUS)) { //enableRead(); } return true; }
int Listener::open(const struct sockaddr *sa, int socklen, int backlog){ int family = sa ? sa->sa_family : AF_UNSPEC; if (backlog == 0) return -1; evutil_socket_t fd = socket(family, SOCK_STREAM, 0); if (fd == -1) return -1; if (evutil_make_socket_nonblocking(fd) < 0) { evutil_closesocket(fd); return -1; } if (flags & LEV_OPT_CLOSE_ON_EXEC) { if (evutil_make_socket_closeonexec(fd) < 0) { evutil_closesocket(fd); return -1; } } if (setKeepAlive(fd)) { evutil_closesocket(fd); return -1; } if (flags & LEV_OPT_REUSEABLE) { if (evutil_make_listen_socket_reuseable(fd) < 0) { evutil_closesocket(fd); return -1; } } if (sa) { if (bind(fd, sa, socklen)<0) { evutil_closesocket(fd); return -1; } } int ret = this->open(fd, backlog); if (ret <0){ evutil_closesocket(fd); return ret; } return 0; }
bool TransportTCP::initializeSocket() { ROS_ASSERT(sock_ != ROS_INVALID_SOCKET); if (!setNonBlocking()) { return false; } setKeepAlive(s_use_keepalive_, 60, 10, 9); // connect() will set cached_remote_host_ because it already has the host/port available if (cached_remote_host_.empty()) { if (is_server_) { cached_remote_host_ = "TCPServer Socket"; } else { std::stringstream ss; ss << getClientURI() << " on socket " << sock_; cached_remote_host_ = ss.str(); } } #ifdef ROSCPP_USE_TCP_NODELAY setNoDelay(true); #endif ROS_ASSERT(poll_set_ || (flags_ & SYNCHRONOUS)); if (poll_set_) { ROS_DEBUG("Adding tcp socket [%d] to pollset", sock_); poll_set_->addSocket(sock_, boost::bind(&TransportTCP::socketUpdate, this, _1), shared_from_this()); } if (!(flags_ & SYNCHRONOUS)) { //enableRead(); } return true; }
std::ostream& HTTPServerResponseImpl::send() { poco_assert (!_pStream); if ((_pRequest && _pRequest->getMethod() == HTTPRequest::HTTP_HEAD) || getStatus() < 200 || getStatus() == HTTPResponse::HTTP_NO_CONTENT || getStatus() == HTTPResponse::HTTP_NOT_MODIFIED) { Poco::CountingOutputStream cs; write(cs); _pStream = new HTTPFixedLengthOutputStream(_session, cs.chars()); write(*_pStream); } else if (getChunkedTransferEncoding()) { HTTPHeaderOutputStream hs(_session); write(hs); _pStream = new HTTPChunkedOutputStream(_session); } else if (hasContentLength()) { Poco::CountingOutputStream cs; write(cs); #if defined(POCO_HAVE_INT64) _pStream = new HTTPFixedLengthOutputStream(_session, getContentLength64() + cs.chars()); #else _pStream = new HTTPFixedLengthOutputStream(_session, getContentLength() + cs.chars()); #endif write(*_pStream); } else { _pStream = new HTTPOutputStream(_session); setKeepAlive(false); write(*_pStream); } return *_pStream; }